OSDN Git Service

simpleperf: use libprocinfo.
authorJosh Gao <jmgao@google.com>
Fri, 11 Nov 2016 21:59:07 +0000 (13:59 -0800)
committerJosh Gao <jmgao@google.com>
Fri, 11 Nov 2016 22:46:37 +0000 (14:46 -0800)
Test: python runtest/runtest.py.
Test: simpleperf_unit_test
Change-Id: Ie19c0010571392459c03928208db21f0ba48b6df

simpleperf/Android.mk
simpleperf/environment.cpp

index 3c40292..aab702b 100644 (file)
@@ -43,6 +43,7 @@ simpleperf_static_libraries_target := \
   libbase \
   libcutils \
   liblog \
+  libprocinfo \
   libutils \
   liblzma \
   libLLVMObject \
@@ -71,6 +72,7 @@ simpleperf_static_libraries_host := \
   libprotobuf-cpp-lite \
 
 simpleperf_static_libraries_host_linux := \
+  libprocinfo \
   libbacktrace_offline \
   libbacktrace \
   libunwind \
index 373f3e0..e3fd4ee 100644 (file)
@@ -31,6 +31,7 @@
 #include <android-base/parseint.h>
 #include <android-base/strings.h>
 #include <android-base/stringprintf.h>
+#include <procinfo/process.h>
 
 #if defined(__ANDROID__)
 #include <sys/system_properties.h>
@@ -218,46 +219,22 @@ void GetKernelAndModuleMmaps(KernelMmap* kernel_mmap, std::vector<KernelMmap>* m
 }
 
 static bool ReadThreadNameAndPid(pid_t tid, std::string* comm, pid_t* pid) {
-  std::string status_file = android::base::StringPrintf("/proc/%d/status", tid);
-  FILE* fp = fopen(status_file.c_str(), "re");
-  if (fp == nullptr) {
+  android::procinfo::ProcessInfo procinfo;
+  if (!android::procinfo::GetProcessInfo(tid, &procinfo)) {
     return false;
   }
-  bool read_comm = false;
-  bool read_tgid = false;
-  LineReader reader(fp);
-  char* line;
-  while ((line = reader.ReadLine()) != nullptr) {
-    char s[reader.MaxLineSize()];
-    pid_t tgid;
-    if (sscanf(line, "Name:%s", s) == 1) {
-      read_comm = true;
-      if (comm != nullptr) {
-        *comm = s;
-      }
-    } else if (sscanf(line, "Tgid:%d", &tgid) == 1) {
-      read_tgid = true;
-      if (pid != nullptr) {
-        *pid = tgid;
-      }
-    }
-    if (read_comm && read_tgid) {
-      return true;
-    }
+  if (comm != nullptr) {
+    *comm = procinfo.name;
   }
-  return false;
+  if (pid != nullptr) {
+    *pid = procinfo.pid;
+  }
+  return true;
 }
 
 std::vector<pid_t> GetThreadsInProcess(pid_t pid) {
   std::vector<pid_t> result;
-  std::string task_dirname = android::base::StringPrintf("/proc/%d/task", pid);
-  for (const auto& name : GetSubDirs(task_dirname)) {
-    int tid;
-    if (!android::base::ParseInt(name.c_str(), &tid, 0)) {
-      continue;
-    }
-    result.push_back(tid);
-  }
+  android::procinfo::GetProcessTids(pid, &result);
   return result;
 }