Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit de42af01 authored by Colin Cross's avatar Colin Cross
Browse files

libmemunreachable: fix long timeout on error

The collection thread should unblock the parent when it fails in order
to prevent a 100 second timeout delay.  Also reduce the timeout to 30
seconds, and fix a few log messages.

Bug: 27208635
Change-Id: I47f9ce4f645c453810fec57bef557c32a665eefb
(cherry picked from commit b1b7923e)
parent 7add50d8
Loading
Loading
Loading
Loading
+6 −3
Original line number Original line Diff line number Diff line
@@ -224,16 +224,19 @@ bool GetUnreachableMemory(UnreachableMemoryInfo& info, size_t limit) {


    // ptrace all the threads
    // ptrace all the threads
    if (!thread_capture.CaptureThreads()) {
    if (!thread_capture.CaptureThreads()) {
      continue_parent_sem.Post();
      return 1;
      return 1;
    }
    }


    // collect register contents and stacks
    // collect register contents and stacks
    if (!thread_capture.CapturedThreadInfo(thread_info)) {
    if (!thread_capture.CapturedThreadInfo(thread_info)) {
      continue_parent_sem.Post();
      return 1;
      return 1;
    }
    }


    // snapshot /proc/pid/maps
    // snapshot /proc/pid/maps
    if (!ProcessMappings(parent_pid, mappings)) {
    if (!ProcessMappings(parent_pid, mappings)) {
      continue_parent_sem.Post();
      return 1;
      return 1;
    }
    }


@@ -306,7 +309,7 @@ bool GetUnreachableMemory(UnreachableMemoryInfo& info, size_t limit) {


    // Wait for the collection thread to signal that it is ready to fork the
    // Wait for the collection thread to signal that it is ready to fork the
    // heap walker process.
    // heap walker process.
    continue_parent_sem.Wait(100s);
    continue_parent_sem.Wait(30s);


    // Re-enable malloc so the collection thread can fork.
    // Re-enable malloc so the collection thread can fork.
  }
  }
@@ -347,7 +350,7 @@ std::string Leak::ToString(bool log_contents) const {
  std::ostringstream oss;
  std::ostringstream oss;


  oss << "  " << std::dec << size;
  oss << "  " << std::dec << size;
  oss << " bytes at ";
  oss << " bytes unreachable at ";
  oss << std::hex << begin;
  oss << std::hex << begin;
  oss << std::endl;
  oss << std::endl;


@@ -405,7 +408,7 @@ std::string UnreachableMemoryInfo::ToString(bool log_contents) const {
std::string GetUnreachableMemoryString(bool log_contents, size_t limit) {
std::string GetUnreachableMemoryString(bool log_contents, size_t limit) {
  UnreachableMemoryInfo info;
  UnreachableMemoryInfo info;
  if (!GetUnreachableMemory(info, limit)) {
  if (!GetUnreachableMemory(info, limit)) {
    return "Failed to get unreachable memory";
    return "Failed to get unreachable memory\n";
  }
  }


  return info.ToString(log_contents);
  return info.ToString(log_contents);