summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKalesh Singh <kaleshsingh@google.com>2020-12-23 01:28:45 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2020-12-23 01:28:45 +0000
commit4669770b47fe8dbe033c64a5e1f5608d8ceb962c (patch)
tree7a75a66773a0fa7e5af32778e67aaf3c76efd723
parent1a4fb47b70e00eae75adffd7c27bffc7e10527bf (diff)
parent2e12c78fbca041d5262f019c62dfb53168c45f8c (diff)
downloadlibmemtrack-4669770b47fe8dbe033c64a5e1f5608d8ceb962c.tar.gz
Reland: libmemtrack: Add support for AIDL memtrack HAL am: 2e12c78fbc
Original change: https://android-review.googlesource.com/c/platform/system/memory/libmemtrack/+/1534121 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: I4cbec66b1cb9fb992ad70e17168904b7a0d0c1a0
-rw-r--r--Android.bp2
-rw-r--r--memtrack.cpp76
2 files changed, 75 insertions, 3 deletions
diff --git a/Android.bp b/Android.bp
index c7dff5a..220ee02 100644
--- a/Android.bp
+++ b/Android.bp
@@ -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;