diff options
author | John Reck <jreck@google.com> | 2017-07-05 16:39:36 -0700 |
---|---|---|
committer | John Reck <jreck@google.com> | 2017-07-05 16:48:09 -0700 |
commit | 34781b253083703502a7874df3619196bc7106cd (patch) | |
tree | c7cb16330a964a6ca66e89843454b0609648c8e8 /libs/hwui/ProfileDataContainer.cpp | |
parent | 60b108d75815e1ec10e5198c59808fdc46d5db33 (diff) |
Move frame history into jank tracker
Test: hwui_unit_tests & manual
Change-Id: If761947652750640268217cd8cd97c8382441b44
Diffstat (limited to 'libs/hwui/ProfileDataContainer.cpp')
-rw-r--r-- | libs/hwui/ProfileDataContainer.cpp | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/libs/hwui/ProfileDataContainer.cpp b/libs/hwui/ProfileDataContainer.cpp new file mode 100644 index 000000000000..cbf3eb390f53 --- /dev/null +++ b/libs/hwui/ProfileDataContainer.cpp @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ProfileDataContainer.h" + +#include <log/log.h> +#include <cutils/ashmem.h> + +#include <sys/mman.h> + +namespace android { +namespace uirenderer { + +void ProfileDataContainer::freeData() { + if (mIsMapped) { + munmap(mData, sizeof(ProfileData)); + } else { + delete mData; + } + mIsMapped = false; + mData = nullptr; +} + +void ProfileDataContainer::rotateStorage() { + // If we are mapped we want to stop using the ashmem backend and switch to malloc + // We are expecting a switchStorageToAshmem call to follow this, but it's not guaranteed + // If we aren't sitting on top of ashmem then just do a reset() as it's functionally + // equivalent do a free, malloc, reset. + if (mIsMapped) { + freeData(); + mData = new ProfileData; + } + mData->reset(); +} + +void ProfileDataContainer::switchStorageToAshmem(int ashmemfd) { + int regionSize = ashmem_get_size_region(ashmemfd); + if (regionSize < 0) { + int err = errno; + ALOGW("Failed to get ashmem region size from fd %d, err %d %s", ashmemfd, err, strerror(err)); + return; + } + if (regionSize < static_cast<int>(sizeof(ProfileData))) { + ALOGW("Ashmem region is too small! Received %d, required %u", + regionSize, static_cast<unsigned int>(sizeof(ProfileData))); + return; + } + ProfileData* newData = reinterpret_cast<ProfileData*>( + mmap(NULL, sizeof(ProfileData), PROT_READ | PROT_WRITE, + MAP_SHARED, ashmemfd, 0)); + if (newData == MAP_FAILED) { + int err = errno; + ALOGW("Failed to move profile data to ashmem fd %d, error = %d", + ashmemfd, err); + return; + } + + newData->mergeWith(*mData); + freeData(); + mData = newData; + mIsMapped = true; +} + +} /* namespace uirenderer */ +} /* namespace android */
\ No newline at end of file |