As mentioned in the pydrivers commit, I had to change the order in

exit_usiblender() to finalize Python before main library data was freed.
This solved a somewhat specific sigsegv with pydrivers, but as Ken
Hughes found out (thanks!) caused one with scripts that called Blender.Exit().

Now running scripts (G.main->script) are freed in BPY_end_python()
itself (so before the rest of the library data is freed), before
Py_Finalize(). Works fine in all my tests so far.

The file script.c should become obsolete with this change (I added a
comment about it there). If all is indeed fine, it will be removed
later.
This commit is contained in:
Willian Padovani Germano 2006-05-02 02:42:08 +00:00
parent 30f4f3e2c4
commit 35b8dac2ca
2 changed files with 22 additions and 0 deletions

@ -54,6 +54,9 @@
#endif
*/
/* XXX this function and so also the file should not be needed anymore,
* since we have to force clearing all Python related data before freeing
* Blender's library. Still testing, will decide later (Willian). */
void free_script (Script *script)
{
if (!script) return;

@ -174,6 +174,8 @@ void BPY_start_python( int argc, char **argv )
/*****************************************************************************/
void BPY_end_python( void )
{
Script *script = NULL;
if( bpy_registryDict ) {
Py_DECREF( bpy_registryDict );
bpy_registryDict = NULL;
@ -184,6 +186,13 @@ void BPY_end_python( void )
bpy_pydriver_Dict = NULL;
}
/* Freeing all scripts here prevents problems with the order in which
* Python is finalized and G.main is freed in exit_usiblender() */
for (script = G.main->script.first; script; script = script->id.next) {
BPY_clear_script(script);
free_libblock( &G.main->script, script );
}
Py_Finalize( );
BPyMenu_RemoveAllEntries( ); /* freeing bpymenu mem */
@ -912,10 +921,20 @@ void BPY_clear_script( Script * script )
if( !script )
return;
if (!Py_IsInitialized()) {
printf("\nError: trying to free script data after finalizing Python!");
printf("\nScript name: %s\n", script->id.name+2);
return;
}
Py_XDECREF( ( PyObject * ) script->py_draw );
Py_XDECREF( ( PyObject * ) script->py_event );
Py_XDECREF( ( PyObject * ) script->py_button );
Py_XDECREF( ( PyObject * ) script->py_browsercallback );
script->py_draw = NULL;
script->py_event = NULL;
script->py_button = NULL;
script->py_browsercallback = NULL;
dict = script->py_globaldict;