diff options
author | Kalesh Singh <kaleshsingh@google.com> | 2020-12-23 02:14:39 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-12-23 02:14:39 +0000 |
commit | efa607e7c58452b0668610c28c459183e9471ebe (patch) | |
tree | 7a75a66773a0fa7e5af32778e67aaf3c76efd723 | |
parent | 4a4b936110005730f7dd630d273d1aa1e69f213f (diff) | |
parent | 6729b3251ba10e06e952d0266f1c6f463a1464f8 (diff) | |
download | libmemtrack-efa607e7c58452b0668610c28c459183e9471ebe.tar.gz |
Reland: libmemtrack: Add support for AIDL memtrack HAL am: 2e12c78fbc am: 4669770b47 am: 6729b3251b
Original change: https://android-review.googlesource.com/c/platform/system/memory/libmemtrack/+/1534121
MUST ONLY BE SUBMITTED BY AUTOMERGER
Change-Id: I863d995349f31efb93cc65af47cf98461b0704a5
-rw-r--r-- | Android.bp | 2 | ||||
-rw-r--r-- | memtrack.cpp | 76 |
2 files changed, 75 insertions, 3 deletions
@@ -11,12 +11,14 @@ cc_library_shared { local_include_dirs: ["include"], include_dirs: ["hardware/libhardware/include"], shared_libs: [ + "libbinder_ndk", "libhardware", "liblog", "libbase", "libhidlbase", "libutils", "android.hardware.memtrack@1.0", + "android.hardware.memtrack-unstable-ndk_platform", ], cflags: [ "-Wall", diff --git a/memtrack.cpp b/memtrack.cpp index 3fc24c8..807a5c3 100644 --- a/memtrack.cpp +++ b/memtrack.cpp @@ -14,14 +14,18 @@ * limitations under the License. */ #define LOG_TAG "memtrack" + +#include <aidl/android/hardware/memtrack/IMemtrack.h> +#include <aidl/android/hardware/memtrack/MemtrackType.h> +#include <android/binder_manager.h> #include <android/hardware/memtrack/1.0/IMemtrack.h> #include <memtrack/memtrack.h> #include <errno.h> #include <malloc.h> -#include <vector> #include <string.h> #include <mutex> +#include <vector> #include <log/log.h> @@ -33,6 +37,41 @@ using android::hardware::memtrack::V1_0::MemtrackStatus; using android::hardware::hidl_vec; using android::hardware::Return; +namespace V1_0 = android::hardware::memtrack::V1_0; +namespace V_aidl = aidl::android::hardware::memtrack; + +// Check Memtrack Flags +static_assert(static_cast<uint32_t>(V1_0::MemtrackFlag::SMAPS_ACCOUNTED) == + static_cast<uint32_t>(V_aidl::MemtrackRecord::FLAG_SMAPS_ACCOUNTED)); +static_assert(static_cast<uint32_t>(V1_0::MemtrackFlag::SMAPS_UNACCOUNTED) == + static_cast<uint32_t>(V_aidl::MemtrackRecord::FLAG_SMAPS_UNACCOUNTED)); +static_assert(static_cast<uint32_t>(V1_0::MemtrackFlag::SHARED) == + static_cast<uint32_t>(V_aidl::MemtrackRecord::FLAG_SHARED)); +static_assert(static_cast<uint32_t>(V1_0::MemtrackFlag::SHARED_PSS) == + static_cast<uint32_t>(V_aidl::MemtrackRecord::FLAG_SHARED_PSS)); +static_assert(static_cast<uint32_t>(V1_0::MemtrackFlag::PRIVATE) == + static_cast<uint32_t>(V_aidl::MemtrackRecord::FLAG_PRIVATE)); +static_assert(static_cast<uint32_t>(V1_0::MemtrackFlag::SYSTEM) == + static_cast<uint32_t>(V_aidl::MemtrackRecord::FLAG_SYSTEM)); +static_assert(static_cast<uint32_t>(V1_0::MemtrackFlag::DEDICATED) == + static_cast<uint32_t>(V_aidl::MemtrackRecord::FLAG_DEDICATED)); +static_assert(static_cast<uint32_t>(V1_0::MemtrackFlag::NONSECURE) == + static_cast<uint32_t>(V_aidl::MemtrackRecord::FLAG_NONSECURE)); +static_assert(static_cast<uint32_t>(V1_0::MemtrackFlag::SECURE) == + static_cast<uint32_t>(V_aidl::MemtrackRecord::FLAG_SECURE)); + +// Check Memtrack Types +static_assert(static_cast<uint32_t>(V1_0::MemtrackType::OTHER) == + static_cast<uint32_t>(V_aidl::MemtrackType::OTHER)); +static_assert(static_cast<uint32_t>(V1_0::MemtrackType::GL) == + static_cast<uint32_t>(V_aidl::MemtrackType::GL)); +static_assert(static_cast<uint32_t>(V1_0::MemtrackType::GRAPHICS) == + static_cast<uint32_t>(V_aidl::MemtrackType::GRAPHICS)); +static_assert(static_cast<uint32_t>(V1_0::MemtrackType::MULTIMEDIA) == + static_cast<uint32_t>(V_aidl::MemtrackType::MULTIMEDIA)); +static_assert(static_cast<uint32_t>(V1_0::MemtrackType::CAMERA) == + static_cast<uint32_t>(V_aidl::MemtrackType::CAMERA)); + struct memtrack_proc_type { MemtrackType type; std::vector<MemtrackRecord> records; @@ -44,7 +83,7 @@ struct memtrack_proc { }; //TODO(b/31632518) -static android::sp<IMemtrack> get_instance() { +static android::sp<V1_0::IMemtrack> get_hidl_instance() { static android::sp<IMemtrack> module = IMemtrack::getService(); static bool logged = false; if (module == nullptr && !logged) { @@ -54,6 +93,17 @@ static android::sp<IMemtrack> get_instance() { return module; } +static std::shared_ptr<V_aidl::IMemtrack> get_aidl_instance() { + const auto instance = std::string() + V_aidl::IMemtrack::descriptor + "/default"; + static bool declared = AServiceManager_isDeclared(instance.c_str()); + if (!declared) { + return nullptr; + } + static ndk::SpAIBinder memtrack_binder = + ndk::SpAIBinder(AServiceManager_waitForService(instance.c_str())); + return V_aidl::IMemtrack::fromBinder(memtrack_binder); +} + memtrack_proc *memtrack_proc_new(void) { return new memtrack_proc(); @@ -68,7 +118,27 @@ static int memtrack_proc_get_type(memtrack_proc_type *t, pid_t pid, MemtrackType type) { int err = 0; - android::sp<IMemtrack> memtrack = get_instance(); + + std::shared_ptr<V_aidl::IMemtrack> service= get_aidl_instance(); + if (service) { + std::vector<V_aidl::MemtrackRecord> records; + auto status = service->getMemory( + pid, static_cast<V_aidl::MemtrackType>(static_cast<uint32_t>(type)), &records); + + if (!status.isOk()) { + return -1; + } + + t->records.resize(records.size()); + for (size_t i = 0; i < records.size(); i++) { + t->records[i].sizeInBytes = records[i].sizeInBytes; + t->records[i].flags = records[i].flags; + } + + return err; + } + + android::sp<V1_0::IMemtrack> memtrack = get_hidl_instance(); if (memtrack == nullptr) return -1; |