From 03f028d9250d88550a6c32b7af5644bc74252e3a Mon Sep 17 00:00:00 2001
From: "Peter W. Draper" <p.w.draper@durham.ac.uk>
Date: Tue, 19 Mar 2019 20:34:36 +0000
Subject: [PATCH] Make error report about memory use more interesting by
 keeping a record of the failed allocation, also keep one error dump per rank
 (stop overwrites)

---
 src/error.h  |  2 +-
 src/memuse.c | 14 ++++++++++++++
 src/memuse.h | 15 +++++++++++++--
 3 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/src/error.h b/src/error.h
index ee9a6765b6..de4e9fa44c 100644
--- a/src/error.h
+++ b/src/error.h
@@ -46,7 +46,7 @@
 
 /* If reporting memory usage, try to dump that when exiting in error. */
 #ifdef SWIFT_MEMUSE_REPORTS
-#define memdump(rank) memuse_log_dump("memuse-error-report.txt");
+#define memdump(rank) memuse_log_dump_error(rank);
 #else
 #define memdump(rank)
 #endif
diff --git a/src/memuse.c b/src/memuse.c
index 02b5334c69..0c74bea4ed 100644
--- a/src/memuse.c
+++ b/src/memuse.c
@@ -146,6 +146,8 @@ void memuse_log_allocation(const char *label, void *ptr, int allocated,
 
 /**
  * @brief dump the log to a file and reset, if anything to dump.
+ *
+ * @param filename name of file for log dump.
  */
 void memuse_log_dump(const char *filename) {
 
@@ -176,6 +178,18 @@ void memuse_log_dump(const char *filename) {
   fclose(fd);
 }
 
+/**
+ * @brief dump the log for using the given rank to generate a standard
+ *        name for the output. Used when exiting in error.
+ *
+ * @param rank the rank exiting in error.
+ */
+void memuse_log_dump_error(int rank) {
+    char filename[60];
+    sprintf(filename, "memuse-error-report-rank%d.txt", rank);
+    memuse_log_dump(filename);
+}
+
 #endif /* SWIFT_MEMUSE_REPORTS */
 
 /**
diff --git a/src/memuse.h b/src/memuse.h
index e9bb16733c..7df4a2efb8 100644
--- a/src/memuse.h
+++ b/src/memuse.h
@@ -32,6 +32,7 @@ const char *memuse_process(int inmb);
 
 #ifdef SWIFT_MEMUSE_REPORTS
 void memuse_log_dump(const char *filename);
+void memuse_log_dump_error(int rank);
 void memuse_log_allocation(const char *label, void *ptr, int allocated,
                            size_t size);
 #else
@@ -57,7 +58,12 @@ __attribute__((always_inline)) inline int swift_memalign(const char *label,
                                                          size_t size) {
   int result = posix_memalign(memptr, alignment, size);
 #ifdef SWIFT_MEMUSE_REPORTS
-  if (result == 0) memuse_log_allocation(label, *memptr, 1, size);
+  if (result == 0) {
+    memuse_log_allocation(label, *memptr, 1, size);
+  } else {
+    /* Failed allocations are interesting as well. */
+    memuse_log_allocation(label, NULL, 1, size);
+  }
 #endif
   return result;
 }
@@ -77,7 +83,12 @@ __attribute__((always_inline)) inline void *swift_malloc(const char *label,
                                                          size_t size) {
   void *memptr = malloc(size);
 #ifdef SWIFT_MEMUSE_REPORTS
-  if (memptr != NULL) memuse_log_allocation(label, memptr, 1, size);
+  if (memptr != NULL) {
+    memuse_log_allocation(label, memptr, 1, size);
+  } else {
+    /* Failed allocations are interesting as well. */
+    memuse_log_allocation(label, NULL, 1, size);
+  }
 #endif
   return memptr;
 }
-- 
GitLab