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

Commit 4207df11 authored by Christopher Ferris's avatar Christopher Ferris Committed by Gerrit Code Review
Browse files

Merge "Use stat structure to keep oldest mtime."

parents 829ae5be 68bd59f6
Loading
Loading
Loading
Loading
+11 −20
Original line number Original line Diff line number Diff line
@@ -55,11 +55,6 @@
// Must match the path defined in NativeCrashListener.java
// Must match the path defined in NativeCrashListener.java
#define NCRASH_SOCKET_PATH "/data/system/ndebugsocket"
#define NCRASH_SOCKET_PATH "/data/system/ndebugsocket"


#define typecheck(x,y) {    \
  typeof(x) __dummy1;     \
  typeof(y) __dummy2;     \
  (void)(&__dummy1 == &__dummy2); }

static bool signal_has_address(int sig) {
static bool signal_has_address(int sig) {
  switch (sig) {
  switch (sig) {
    case SIGILL:
    case SIGILL:
@@ -653,28 +648,19 @@ static bool dump_crash(log_t* log, pid_t pid, pid_t tid, int signal, uintptr_t a
//
//
// Returns the path of the tombstone file, allocated using malloc().  Caller must free() it.
// Returns the path of the tombstone file, allocated using malloc().  Caller must free() it.
static char* find_and_open_tombstone(int* fd) {
static char* find_and_open_tombstone(int* fd) {
#ifdef __aarch64__
  // In a single pass, find an available slot and, in case none
  long mtime = LONG_MAX;
#else
  unsigned long mtime = ULONG_MAX;
#endif
  struct stat sb;

  // XXX: Our stat.st_mtime isn't time_t. If it changes, as it probably ought
  // to, our logic breaks. This check will generate a warning if that happens.
  typecheck(mtime, sb.st_mtime);

  // In a single wolf-like pass, find an available slot and, in case none
  // exist, find and record the least-recently-modified file.
  // exist, find and record the least-recently-modified file.
  char path[128];
  char path[128];
  int oldest = 0;
  int oldest = -1;
  struct stat oldest_sb;
  for (int i = 0; i < MAX_TOMBSTONES; i++) {
  for (int i = 0; i < MAX_TOMBSTONES; i++) {
    snprintf(path, sizeof(path), TOMBSTONE_TEMPLATE, i);
    snprintf(path, sizeof(path), TOMBSTONE_TEMPLATE, i);


    struct stat sb;
    if (!stat(path, &sb)) {
    if (!stat(path, &sb)) {
      if (sb.st_mtime < mtime) {
      if (oldest < 0 || sb.st_mtime < oldest_sb.st_mtime) {
        oldest = i;
        oldest = i;
        mtime = sb.st_mtime;
        oldest_sb.st_mtime = sb.st_mtime;
      }
      }
      continue;
      continue;
    }
    }
@@ -689,6 +675,11 @@ static char* find_and_open_tombstone(int* fd) {
    return strdup(path);
    return strdup(path);
  }
  }


  if (oldest < 0) {
    LOG("Failed to find a valid tombstone, default to using tombstone 0.\n");
    oldest = 0;
  }

  // we didn't find an available file, so we clobber the oldest one
  // we didn't find an available file, so we clobber the oldest one
  snprintf(path, sizeof(path), TOMBSTONE_TEMPLATE, oldest);
  snprintf(path, sizeof(path), TOMBSTONE_TEMPLATE, oldest);
  *fd = open(path, O_CREAT | O_TRUNC | O_WRONLY, 0600);
  *fd = open(path, O_CREAT | O_TRUNC | O_WRONLY, 0600);