Commit: 83c0f6ac3740cc8d7fb17a8b837ac95a8956805c
Author: Campbell Barton
Date:   Thu Jul 7 12:30:45 2022 +1000
Branches: master
https://developer.blender.org/rB83c0f6ac3740cc8d7fb17a8b837ac95a8956805c

Python: clear Py-driver variables on exit

These kinds of leaks are relatively harmless, it reduces the number of
un-freed data reported by valgrind on exit.

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

M       source/blender/python/BPY_extern.h
M       source/blender/python/intern/bpy_driver.c
M       source/blender/python/intern/bpy_interface.c

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

diff --git a/source/blender/python/BPY_extern.h 
b/source/blender/python/BPY_extern.h
index 0ab26fde34f..8075e4ecd22 100644
--- a/source/blender/python/BPY_extern.h
+++ b/source/blender/python/BPY_extern.h
@@ -69,6 +69,11 @@ void BPY_modules_load_user(struct bContext *C);
 
 void BPY_app_handlers_reset(bool do_all);
 
+/**
+ * Run on exit to free any cached data.
+ */
+void BPY_driver_exit(void);
+
 /**
  * Update function, it gets rid of python-drivers global dictionary: 
`bpy.app.driver_namespace`,
  * forcing #BPY_driver_exec to recreate it. Use this when loading a new 
`.blend` file
diff --git a/source/blender/python/intern/bpy_driver.c 
b/source/blender/python/intern/bpy_driver.c
index aa627a42a2b..3134969d21c 100644
--- a/source/blender/python/intern/bpy_driver.c
+++ b/source/blender/python/intern/bpy_driver.c
@@ -233,15 +233,8 @@ static void bpy_pydriver_namespace_update_depsgraph(struct 
Depsgraph *depsgraph)
   }
 }
 
-void BPY_driver_reset(void)
+void BPY_driver_exit(void)
 {
-  PyGILState_STATE gilstate;
-  const bool use_gil = true; /* !PyC_IsInterpreterActive(); */
-
-  if (use_gil) {
-    gilstate = PyGILState_Ensure();
-  }
-
   if (bpy_pydriver_Dict) { /* Free the global dict used by python-drivers. */
     PyDict_Clear(bpy_pydriver_Dict);
     Py_DECREF(bpy_pydriver_Dict);
@@ -261,6 +254,19 @@ void BPY_driver_reset(void)
   /* Freed when clearing driver dictionary. */
   g_pydriver_state_prev.self = NULL;
   g_pydriver_state_prev.depsgraph = NULL;
+}
+
+void BPY_driver_reset(void)
+{
+  PyGILState_STATE gilstate;
+  const bool use_gil = true; /* !PyC_IsInterpreterActive(); */
+
+  if (use_gil) {
+    gilstate = PyGILState_Ensure();
+  }
+
+  /* Currently exit/reset are practically the same besides the GIL check. */
+  BPY_driver_exit();
 
   if (use_gil) {
     PyGILState_Release(gilstate);
diff --git a/source/blender/python/intern/bpy_interface.c 
b/source/blender/python/intern/bpy_interface.c
index ea64fa6c098..939fa475344 100644
--- a/source/blender/python/intern/bpy_interface.c
+++ b/source/blender/python/intern/bpy_interface.c
@@ -512,6 +512,9 @@ void BPY_python_end(void)
   /* finalizing, no need to grab the state, except when we are a module */
   gilstate = PyGILState_Ensure();
 
+  /* Frees the python-driver name-space & cached data. */
+  BPY_driver_exit();
+
   /* Clear Python values in the context so freeing the context after Python 
exits doesn't crash. */
   bpy_context_end(BPY_context_get());

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to