[Bf-blender-cvs] [62f2925e438] master: Fix T80774: (correction) keep MEM_init_memleak_detection call early

Campbell Barton noreply at git.blender.org
Tue Sep 15 05:33:44 CEST 2020


Commit: 62f2925e438fae25f0dab615a7932774586669f3
Author: Campbell Barton
Date:   Tue Sep 15 13:23:06 2020 +1000
Branches: master
https://developer.blender.org/rB62f2925e438fae25f0dab615a7932774586669f3

Fix T80774: (correction) keep MEM_init_memleak_detection call early

===================================================================

M	intern/guardedalloc/MEM_guardedalloc.h
M	intern/guardedalloc/intern/leak_detector.cc
M	source/creator/creator.c

===================================================================

diff --git a/intern/guardedalloc/MEM_guardedalloc.h b/intern/guardedalloc/MEM_guardedalloc.h
index 71d3c512306..78e629a6971 100644
--- a/intern/guardedalloc/MEM_guardedalloc.h
+++ b/intern/guardedalloc/MEM_guardedalloc.h
@@ -215,6 +215,12 @@ extern const char *(*MEM_name_ptr)(void *vmemh);
  * about memory leaks will be printed on exit. */
 void MEM_init_memleak_detection(void);
 
+/**
+ * Use this if we want to call #exit during argument parsing for example,
+ * without having to free all data.
+ */
+void MEM_use_memleak_detection(bool enabled);
+
 /** When this has been called and memory leaks have been detected, the process will have an exit
  * code that indicates failure. This can be used for when checking for memory leaks with automated
  * tests. */
diff --git a/intern/guardedalloc/intern/leak_detector.cc b/intern/guardedalloc/intern/leak_detector.cc
index 0ecf2ed8ba7..fb8d4e72cac 100644
--- a/intern/guardedalloc/intern/leak_detector.cc
+++ b/intern/guardedalloc/intern/leak_detector.cc
@@ -32,11 +32,15 @@ char free_after_leak_detection_message[] =
 namespace {
 
 bool fail_on_memleak = false;
+bool ignore_memleak = false;
 
 class MemLeakPrinter {
  public:
   ~MemLeakPrinter()
   {
+    if (ignore_memleak) {
+      return;
+    }
     leak_detector_has_run = true;
     const uint leaked_blocks = MEM_get_memory_blocks_in_use();
     if (leaked_blocks == 0) {
@@ -74,6 +78,11 @@ void MEM_init_memleak_detection(void)
   static MemLeakPrinter printer;
 }
 
+void MEM_use_memleak_detection(bool enabled)
+{
+  ignore_memleak = !enabled;
+}
+
 void MEM_enable_fail_on_memleak(void)
 {
   fail_on_memleak = true;
diff --git a/source/creator/creator.c b/source/creator/creator.c
index 68753366c7d..d2bfcb64b53 100644
--- a/source/creator/creator.c
+++ b/source/creator/creator.c
@@ -297,6 +297,7 @@ int main(int argc,
         break;
       }
     }
+    MEM_init_memleak_detection();
   }
 
 #ifdef BUILD_DATE
@@ -399,6 +400,10 @@ int main(int argc,
 
   main_args_setup(C, ba);
 
+  /* Begin argument parsing, ignore leaks so arguments that call #exit
+   * (such as '--version' & '--help') don't report leaks. */
+  MEM_use_memleak_detection(false);
+
   BLI_argsParse(ba, 1, NULL, NULL);
 
   main_signal_setup();
@@ -499,9 +504,8 @@ int main(int argc,
   callback_main_atexit(&app_init_data);
   BKE_blender_atexit_unregister(callback_main_atexit, &app_init_data);
 
-  /* Initialize memory leak detection after parsing command line arguments
-   * so arguments that call #exit (such as '--version' & '--help') don't report leaks. */
-  MEM_init_memleak_detection();
+  /* End argument parsing, allow memory leaks to be printed. */
+  MEM_use_memleak_detection(true);
 
   /* Paranoid, avoid accidental re-use. */
 #ifndef WITH_PYTHON_MODULE



More information about the Bf-blender-cvs mailing list