[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53675] trunk/blender/source/blender: avoid having dangling panel pointers in the interface, unregistering addons could leave the interface pointing to freed memory.

Campbell Barton ideasman42 at gmail.com
Wed Jan 9 07:00:40 CET 2013


Revision: 53675
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53675
Author:   campbellbarton
Date:     2013-01-09 06:00:33 +0000 (Wed, 09 Jan 2013)
Log Message:
-----------
avoid having dangling panel pointers in the interface, unregistering addons could leave the interface pointing to freed memory.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/UI_interface.h
    trunk/blender/source/blender/editors/interface/interface_panel.c
    trunk/blender/source/blender/makesrna/intern/rna_ui.c

Modified: trunk/blender/source/blender/editors/include/UI_interface.h
===================================================================
--- trunk/blender/source/blender/editors/include/UI_interface.h	2013-01-09 05:32:15 UTC (rev 53674)
+++ trunk/blender/source/blender/editors/include/UI_interface.h	2013-01-09 06:00:33 UTC (rev 53675)
@@ -42,6 +42,7 @@
 struct Main;
 struct ListBase;
 struct ARegion;
+struct ARegionType;
 struct ScrArea;
 struct wmWindow;
 struct wmWindowManager;
@@ -660,6 +661,7 @@
 struct Panel *uiBeginPanel(struct ScrArea *sa, struct ARegion *ar, uiBlock *block, struct PanelType *pt, int *open);
 void uiEndPanel(uiBlock *block, int width, int height);
 void uiScalePanels(struct ARegion *ar, float new_width);
+void uiPanelClearType(struct wmWindowManager *wm, const struct ARegionType *art, const struct PanelType *type);
 
 /* Handlers
  *

Modified: trunk/blender/source/blender/editors/interface/interface_panel.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_panel.c	2013-01-09 05:32:15 UTC (rev 53674)
+++ trunk/blender/source/blender/editors/interface/interface_panel.c	2013-01-09 06:00:33 UTC (rev 53675)
@@ -306,6 +306,31 @@
 	}
 }
 
+void uiPanelClearType(wmWindowManager *wm, const ARegionType *art, const PanelType *type)
+{
+	wmWindow *win;
+	for (win = wm->windows.first; win; win = win->next) {
+		ScrArea *sa;
+		for (sa = win->screen->areabase.first; sa; sa = sa->next) {
+			ARegion *ar;
+			for (ar = sa->regionbase.first; ar; ar = ar->next) {
+				if (ar->type == art) {
+					uiBlock *block, *nblock = ar->uiblocks.first;
+					while ((block = nblock)) {
+						nblock = block->next;
+						if (block->panel) {
+							if (block->panel->type == type) {
+								uiFreeBlock(block->evil_C, block);
+								BLI_remlink(&ar->uiblocks, block);
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+}
+
 static void ui_offset_panel_block(uiBlock *block)
 {
 	uiStyle *style = UI_GetStyleDraw();

Modified: trunk/blender/source/blender/makesrna/intern/rna_ui.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_ui.c	2013-01-09 05:32:15 UTC (rev 53674)
+++ trunk/blender/source/blender/makesrna/intern/rna_ui.c	2013-01-09 06:00:33 UTC (rev 53675)
@@ -165,8 +165,9 @@
 	RNA_parameter_list_free(&list);
 }
 
-static void rna_Panel_unregister(Main *UNUSED(bmain), StructRNA *type)
+static void rna_Panel_unregister(Main *bmain, StructRNA *type)
 {
+	wmWindowManager *wm;
 	ARegionType *art;
 	PanelType *pt = RNA_struct_blender_type_get(type);
 
@@ -174,6 +175,10 @@
 		return;
 	if (!(art = region_type_find(NULL, pt->space_type, pt->region_type)))
 		return;
+
+	for (wm = bmain->wm.first; wm; wm = wm->id.next) {
+		uiPanelClearType(wm, art, pt);
+	}
 	
 	RNA_struct_free_extension(type, &pt->ext);
 




More information about the Bf-blender-cvs mailing list