[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [39293] trunk/blender/source: use ghash for operator and menu types, was doing string lookup in the operator list (containing over 1000 items) for each button draw.

Campbell Barton ideasman42 at gmail.com
Thu Aug 11 08:06:19 CEST 2011


Revision: 39293
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=39293
Author:   campbellbarton
Date:     2011-08-11 06:06:17 +0000 (Thu, 11 Aug 2011)
Log Message:
-----------
use ghash for operator and menu types, was doing string lookup in the operator list (containing over 1000 items) for each button draw.

gives small speedup for UI drawing and overall startup time.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/interface/interface_templates.c
    trunk/blender/source/blender/editors/space_outliner/outliner_draw.c
    trunk/blender/source/blender/editors/space_view3d/view3d_toolbar.c
    trunk/blender/source/blender/python/intern/bpy_operator.c
    trunk/blender/source/blender/windowmanager/WM_api.h
    trunk/blender/source/blender/windowmanager/WM_types.h
    trunk/blender/source/blender/windowmanager/intern/wm.c
    trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c
    trunk/blender/source/blender/windowmanager/intern/wm_operators.c
    trunk/blender/source/blenderplayer/bad_level_call_stubs/stubs.c

Modified: trunk/blender/source/blender/editors/interface/interface_templates.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_templates.c	2011-08-11 05:50:05 UTC (rev 39292)
+++ trunk/blender/source/blender/editors/interface/interface_templates.c	2011-08-11 06:06:17 UTC (rev 39293)
@@ -39,6 +39,7 @@
 
 #include "BLI_string.h"
 #include "BLI_utildefines.h"
+#include "BLI_ghash.h"
 
 #include "BKE_animsys.h"
 #include "BKE_colortools.h"
@@ -2322,10 +2323,11 @@
 
 static void operator_search_cb(const bContext *C, void *UNUSED(arg), const char *str, uiSearchItems *items)
 {
-	wmOperatorType *ot = WM_operatortype_first();
-	
-	for(; ot; ot= ot->next) {
-		
+	GHashIterator *iter= WM_operatortype_iter();
+
+	for( ; !BLI_ghashIterator_isDone(iter); BLI_ghashIterator_step(iter)) {
+		wmOperatorType *ot= BLI_ghashIterator_getValue(iter);
+
 		if(BLI_strcasestr(ot->name, str)) {
 			if(WM_operator_poll((bContext*)C, ot)) {
 				char name[256];
@@ -2345,6 +2347,7 @@
 			}
 		}
 	}
+	BLI_ghashIterator_free(iter);
 }
 
 void uiTemplateOperatorSearch(uiLayout *layout)

Modified: trunk/blender/source/blender/editors/space_outliner/outliner_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_outliner/outliner_draw.c	2011-08-11 05:50:05 UTC (rev 39292)
+++ trunk/blender/source/blender/editors/space_outliner/outliner_draw.c	2011-08-11 06:06:17 UTC (rev 39293)
@@ -66,6 +66,8 @@
 #include "BKE_scene.h"
 #include "BKE_sequencer.h"
 
+#include "BLI_ghash.h"
+
 #include "ED_armature.h"
 #include "ED_object.h"
 #include "ED_screen.h"
@@ -584,9 +586,10 @@
 
 static void operator_search_cb(const struct bContext *UNUSED(C), void *UNUSED(arg_kmi), const char *str, uiSearchItems *items)
 {
-	wmOperatorType *ot = WM_operatortype_first();
-	
-	for(; ot; ot= ot->next) {
+	GHashIterator *iter= WM_operatortype_iter();
+
+	for( ; !BLI_ghashIterator_isDone(iter); BLI_ghashIterator_step(iter)) {
+		wmOperatorType *ot= BLI_ghashIterator_getValue(iter);
 		
 		if(BLI_strcasestr(ot->idname, str)) {
 			char name[OP_MAX_TYPENAME];
@@ -598,6 +601,7 @@
 				break;
 		}
 	}
+	BLI_ghashIterator_free(iter);
 }
 
 /* operator Search browse menu, open */

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_toolbar.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_toolbar.c	2011-08-11 05:50:05 UTC (rev 39292)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_toolbar.c	2011-08-11 06:06:17 UTC (rev 39293)
@@ -46,6 +46,7 @@
 #include "BLI_editVert.h"
 #include "BLI_rand.h"
 #include "BLI_utildefines.h"
+#include "BLI_ghash.h"
 
 #include "BKE_context.h"
 #include "BKE_idprop.h"
@@ -140,10 +141,11 @@
 
 static void operator_search_cb(const struct bContext *C, void *UNUSED(arg), const char *str, uiSearchItems *items)
 {
-	wmOperatorType *ot = WM_operatortype_first();
-	
-	for(; ot; ot= ot->next) {
-		
+	GHashIterator *iter= WM_operatortype_iter();
+
+	for( ; !BLI_ghashIterator_isDone(iter); BLI_ghashIterator_step(iter)) {
+		wmOperatorType *ot= BLI_ghashIterator_getValue(iter);
+
 		if(BLI_strcasestr(ot->name, str)) {
 			if(WM_operator_poll((bContext*)C, ot)) {
 				
@@ -152,6 +154,7 @@
 			}
 		}
 	}
+	BLI_ghashIterator_free(iter);
 }
 
 

Modified: trunk/blender/source/blender/python/intern/bpy_operator.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_operator.c	2011-08-11 05:50:05 UTC (rev 39292)
+++ trunk/blender/source/blender/python/intern/bpy_operator.c	2011-08-11 06:06:17 UTC (rev 39293)
@@ -52,6 +52,9 @@
 #include "WM_types.h"
 
 #include "MEM_guardedalloc.h"
+
+#include "BLI_ghash.h"
+
 #include "BKE_report.h"
 #include "BKE_context.h"
 
@@ -359,15 +362,18 @@
 
 static PyObject *pyop_dir(PyObject *UNUSED(self))
 {
+	GHashIterator *iter= WM_operatortype_iter();
 	PyObject *list= PyList_New(0), *name;
-	wmOperatorType *ot;
-	
-	for(ot= WM_operatortype_first(); ot; ot= ot->next) {
+
+	for( ; !BLI_ghashIterator_isDone(iter); BLI_ghashIterator_step(iter)) {
+		wmOperatorType *ot= BLI_ghashIterator_getValue(iter);
+
 		name= PyUnicode_FromString(ot->idname);
 		PyList_Append(list, name);
 		Py_DECREF(name);
 	}
-	
+	BLI_ghashIterator_free(iter);
+
 	return list;
 }
 

Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h	2011-08-11 05:50:05 UTC (rev 39292)
+++ trunk/blender/source/blender/windowmanager/WM_api.h	2011-08-11 06:06:17 UTC (rev 39293)
@@ -179,7 +179,7 @@
 void		WM_operator_stack_clear(struct wmWindowManager *wm);
 
 struct wmOperatorType *WM_operatortype_find(const char *idnamem, int quiet);
-struct wmOperatorType *WM_operatortype_first(void);
+struct GHashIterator *WM_operatortype_iter(void);
 void		WM_operatortype_append	(void (*opfunc)(struct wmOperatorType*));
 void		WM_operatortype_append_ptr	(void (*opfunc)(struct wmOperatorType*, void *), void *userdata);
 void		WM_operatortype_append_macro_ptr	(void (*opfunc)(struct wmOperatorType*, void *), void *userdata);
@@ -230,6 +230,7 @@
 void		WM_operator_py_idname(char *to, const char *from);
 
 /* *************** menu types ******************** */
+void				WM_menutype_init(void);
 struct MenuType		*WM_menutype_find(const char *idname, int quiet);
 int					WM_menutype_add(struct MenuType* mt);
 int					WM_menutype_contains(struct MenuType* mt);

Modified: trunk/blender/source/blender/windowmanager/WM_types.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_types.h	2011-08-11 05:50:05 UTC (rev 39292)
+++ trunk/blender/source/blender/windowmanager/WM_types.h	2011-08-11 06:06:17 UTC (rev 39293)
@@ -423,8 +423,6 @@
 
 
 typedef struct wmOperatorType {
-	struct wmOperatorType *next, *prev;
-
 	const char *name;		/* text for ui, undo */
 	const char *idname;		/* unique identifier */
 	const char *description;	/* tooltips and python docs */

Modified: trunk/blender/source/blender/windowmanager/intern/wm.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm.c	2011-08-11 05:50:05 UTC (rev 39292)
+++ trunk/blender/source/blender/windowmanager/intern/wm.c	2011-08-11 06:06:17 UTC (rev 39293)
@@ -40,7 +40,11 @@
 
 #include "GHOST_C-api.h"
 
+#include "MEM_guardedalloc.h"
+
+#include "BLI_utildefines.h"
 #include "BLI_blenlib.h"
+#include "BLI_ghash.h"
 
 #include "BKE_blender.h"
 #include "BKE_context.h"
@@ -59,8 +63,6 @@
 #include "wm_draw.h"
 #include "wm.h"
 
-#include "MEM_guardedalloc.h"
-
 #include "ED_screen.h"
 
 #ifdef WITH_PYTHON
@@ -151,14 +153,14 @@
 
 /* ****************************************** */
 
-static ListBase menutypes = {NULL, NULL}; /* global menutype list */
+static GHash *menutypes_hash= NULL;
 
 MenuType *WM_menutype_find(const char *idname, int quiet)
 {
 	MenuType* mt;
 
 	if (idname[0]) {
-		mt= BLI_findstring(&menutypes, idname, offsetof(MenuType, idname));
+		mt= BLI_ghash_lookup(menutypes_hash, idname);
 		if(mt)
 			return mt;
 	}
@@ -171,35 +173,55 @@
 
 int WM_menutype_add(MenuType* mt)
 {
-	BLI_addtail(&menutypes, mt);
+	BLI_ghash_insert(menutypes_hash, (void *)mt->idname, mt);
 	return 1;
 }
 
 /* inefficient but only used for tooltip code */
 int WM_menutype_contains(MenuType* mt)
 {
-	return (mt != NULL && BLI_findindex(&menutypes, mt) != -1);
+	int found= FALSE;
+
+	if(mt) {
+		GHashIterator *iter= BLI_ghashIterator_new(menutypes_hash);
+
+		for( ; !BLI_ghashIterator_isDone(iter); BLI_ghashIterator_step(iter)) {
+			if(mt == BLI_ghashIterator_getValue(iter)) {
+				found= TRUE;
+				break;
+			}
+		}
+		BLI_ghashIterator_free(iter);
+	}
+
+	return found;
 }
 
 void WM_menutype_freelink(MenuType* mt)
 {
-	BLI_freelinkN(&menutypes, mt);
+	BLI_ghash_remove(menutypes_hash, mt->idname, NULL, (GHashValFreeFP)MEM_freeN);
 }
 
+/* called on initialize WM_init() */
+void WM_menutype_init(void)
+{
+	menutypes_hash= BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp, "menutypes_hash gh");
+}
+
 void WM_menutype_free(void)
 {
-	MenuType* mt= menutypes.first, *mt_next;
+	GHashIterator *iter= BLI_ghashIterator_new(menutypes_hash);
 
-	while(mt) {
-		mt_next= mt->next;
-
-		if(mt->ext.free)
+	for( ; !BLI_ghashIterator_isDone(iter); BLI_ghashIterator_step(iter)) {
+		MenuType *mt= BLI_ghashIterator_getValue(iter);
+		if(mt->ext.free) {
 			mt->ext.free(mt->ext.data);
+		}
+	}
+	BLI_ghashIterator_free(iter);
 
-		WM_menutype_freelink(mt);
-
-		mt= mt_next;
-	}
+	BLI_ghash_free(menutypes_hash, NULL, (GHashValFreeFP)MEM_freeN);
+	menutypes_hash= NULL;
 }
 
 /* ****************************************** */

Modified: trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c	2011-08-11 05:50:05 UTC (rev 39292)
+++ trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c	2011-08-11 06:06:17 UTC (rev 39293)
@@ -127,7 +127,8 @@
 	}
 	GHOST_CreateSystemPaths();
 	wm_operatortype_init();
-	
+	WM_menutype_init();
+
 	set_free_windowmanager_cb(wm_close_and_free);	/* library.c */
 	set_blender_test_break_cb(wm_window_testbreak); /* blender.c */
 	DAG_editors_update_cb(ED_render_id_flush_update); /* depsgraph.c */

Modified: trunk/blender/source/blender/windowmanager/intern/wm_operators.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_operators.c	2011-08-11 05:50:05 UTC (rev 39292)
+++ trunk/blender/source/blender/windowmanager/intern/wm_operators.c	2011-08-11 06:06:17 UTC (rev 39293)
@@ -58,6 +58,7 @@
 #include "BLI_math.h"
 #include "BLI_string.h"
 #include "BLI_utildefines.h"
+#include "BLI_ghash.h"
 
 #include "BLO_readfile.h"
 
@@ -100,7 +101,7 @@
 #include "wm_subwindow.h"
 #include "wm_window.h"
 
-static ListBase global_ops= {NULL, NULL};
+static GHash *global_ops_hash= NULL;
 
 /* ************ operator API, exported ********** */
 
@@ -113,7 +114,7 @@
 	WM_operator_bl_idname(idname_bl, idname);
 
 	if (idname_bl[0]) {
-		ot= (wmOperatorType *)BLI_findstring_ptr(&global_ops, idname_bl, offsetof(wmOperatorType, idname));
+		ot= BLI_ghash_lookup(global_ops_hash, idname_bl);
 		if(ot) {
 			return ot;
 		}
@@ -125,9 +126,10 @@

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list