[Bf-blender-cvs] [25866aa] master: BKE_blender: Add own atexit functions

Campbell Barton noreply at git.blender.org
Fri Jun 24 02:01:03 CEST 2016


Commit: 25866aa149968919a5b4ea01b94c5f31227cbd71
Author: Campbell Barton
Date:   Fri Jun 24 10:05:18 2016 +1000
Branches: master
https://developer.blender.org/rB25866aa149968919a5b4ea01b94c5f31227cbd71

BKE_blender: Add own atexit functions

Runs before guarded-alloc leaks print.

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

M	source/blender/blenkernel/BKE_blender.h
M	source/blender/blenkernel/intern/blender.c
M	source/blender/windowmanager/intern/wm_init_exit.c

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

diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h
index 8ce85c8..d2d9c76 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -50,6 +50,11 @@ void BKE_blender_userdef_refresh(void);
 void BKE_blender_callback_test_break_set(void (*func)(void));
 int  BKE_blender_test_break(void);
 
+/* Blenders' own atexit (avoids leaking) */
+void BKE_blender_atexit_register(void (*func)(void *user_data), void *user_data);
+void BKE_blender_atexit_unregister(void (*func)(void *user_data), const void *user_data);
+void BKE_blender_atexit(void);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c
index 15492fb..0805335 100644
--- a/source/blender/blenkernel/intern/blender.c
+++ b/source/blender/blenkernel/intern/blender.c
@@ -226,3 +226,56 @@ int BKE_blender_test_break(void)
 	return (G.is_break == true);
 }
 
+
+/** \name Blender's AtExit
+ *
+ * \note Don't use MEM_mallocN so functions can be registered at any time.
+ * \{ */
+
+struct AtExitData {
+	struct AtExitData *next;
+
+	void (*func)(void *user_data);
+	void *user_data;
+} *g_atexit = NULL;
+
+void BKE_blender_atexit_register(void (*func)(void *user_data), void *user_data)
+{
+	struct AtExitData *ae = malloc(sizeof(*ae));
+	ae->next = g_atexit;
+	ae->func = func;
+	ae->user_data = user_data;
+	g_atexit = ae;
+}
+
+void BKE_blender_atexit_unregister(void (*func)(void *user_data), const void *user_data)
+{
+	struct AtExitData *ae = g_atexit;
+	struct AtExitData **ae_p = &g_atexit;
+
+	while (ae) {
+		if ((ae->func == func) && (ae->user_data == user_data)) {
+			*ae_p = ae->next;
+			free(ae);
+			return;
+		}
+		ae_p = &ae;
+		ae = ae->next;
+	}
+}
+
+void BKE_blender_atexit(void)
+{
+	struct AtExitData *ae = g_atexit, *ae_next;
+	while (ae) {
+		ae_next = ae->next;
+
+		ae->func(ae->user_data);
+
+		free(ae);
+		ae = ae_next;
+	}
+	g_atexit = NULL;
+}
+
+/** \} */
diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c
index a1ca89c..2c9deb0 100644
--- a/source/blender/windowmanager/intern/wm_init_exit.c
+++ b/source/blender/windowmanager/intern/wm_init_exit.c
@@ -579,6 +579,8 @@ void WM_exit_ext(bContext *C, const bool do_python)
 
 	BLI_threadapi_exit();
 
+	BKE_blender_atexit();
+
 	if (MEM_get_memory_blocks_in_use() != 0) {
 		size_t mem_in_use = MEM_get_memory_in_use() + MEM_get_memory_in_use();
 		printf("Error: Not freed memory blocks: %u, total unfreed memory %f MB\n",




More information about the Bf-blender-cvs mailing list