[open-ils-commits] r13789 - trunk/Open-ILS/src/c-apps (scottmk)

svn at svn.open-ils.org svn at svn.open-ils.org
Sun Aug 2 23:02:51 EDT 2009


Author: scottmk
Date: 2009-08-02 23:02:48 -0400 (Sun, 02 Aug 2009)
New Revision: 13789

Modified:
   trunk/Open-ILS/src/c-apps/oils_cstore.c
Log:
In the initialization routines of oils_cstore.c: recoded a couple
of loops to use an osrfHashIterator, instead of creating an
osrfStringArray of keys and then traversing that.  This change
eliminates over 500 mallocs and frees.  In addition, traversing
the osrfHash with an iterator just hops along a linked list,
which is almost certainly faster than calculating a hash total
for every key.


Modified: trunk/Open-ILS/src/c-apps/oils_cstore.c
===================================================================
--- trunk/Open-ILS/src/c-apps/oils_cstore.c	2009-08-02 14:14:04 UTC (rev 13788)
+++ trunk/Open-ILS/src/c-apps/oils_cstore.c	2009-08-03 03:02:48 UTC (rev 13789)
@@ -228,19 +228,21 @@
 	const int global_method_count
 		= sizeof( global_method ) / sizeof ( global_method[0] );
 	
-    int c_index = 0; 
-    char* classname;
-    osrfStringArray* classes = osrfHashKeys( oilsIDL() );
-    osrfLogDebug(OSRF_LOG_MARK, "%d classes loaded", classes->size );
-    osrfLogDebug(OSRF_LOG_MARK,
-		"At most %d methods will be generated", classes->size * global_method_count);
+	unsigned long class_count = osrfHashGetCount( oilsIDL() );
+	osrfLogDebug(OSRF_LOG_MARK, "%lu classes loaded", class_count );
+	osrfLogDebug(OSRF_LOG_MARK,
+		"At most %lu methods will be generated",
+		(unsigned long) (class_count * global_method_count) );
 
+	osrfHashIterator* class_itr = osrfNewHashIterator( oilsIDL() );
+	osrfHash* idlClass = NULL;
+
 	// For each class in IDL...
-    while ( (classname = osrfStringArrayGetString(classes, c_index++)) ) {
+	while( (idlClass = osrfHashIteratorNext( class_itr ) ) ) {
+
+		const char* classname = osrfHashIteratorKey( class_itr );
         osrfLogInfo(OSRF_LOG_MARK, "Generating class methods for %s", classname);
 
-        osrfHash* idlClass = osrfHashGet(oilsIDL(), classname);
-
         if (!osrfStringArrayContains( osrfHashGet(idlClass, "controller"), MODULENAME )) {
             osrfLogInfo(OSRF_LOG_MARK, "%s is not listed as a controller for %s, moving on", MODULENAME, classname);
             continue;
@@ -332,7 +334,7 @@
     } // end for each class in IDL
 
 	buffer_free( method_name );
-	osrfStringArrayFree( classes );
+	osrfHashIteratorFree( class_itr );
 	
     return 0;
 }
@@ -422,12 +424,11 @@
 
     osrfLogInfo(OSRF_LOG_MARK, "%s successfully connected to the database", MODULENAME);
 
-    int i = 0; 
-    char* classname;
-    osrfStringArray* classes = osrfHashKeys( oilsIDL() );
+	osrfHashIterator* class_itr = osrfNewHashIterator( oilsIDL() );
+	osrfHash* class = NULL;
 
-    while ( (classname = osrfStringArrayGetString(classes, i++)) ) {
-        osrfHash* class = osrfHashGet( oilsIDL(), classname );
+	while( (class = osrfHashIteratorNext( class_itr ) ) ) {
+		const char* classname = osrfHashIteratorKey( class_itr );
         osrfHash* fields = osrfHashGet( class, "fields" );
 
 		if( str_is_true( osrfHashGet(class, "virtual") ) ) {
@@ -518,13 +519,12 @@
 				++columnIndex;
 			} // end while loop for traversing result
 			dbi_result_free(result);
-        } else {
-            osrfLogDebug(OSRF_LOG_MARK, "No data found for class [%s]...", (char*)classname);
-        }
-    }
+		} else {
+			osrfLogDebug(OSRF_LOG_MARK, "No data found for class [%s]...", (char*)classname);
+		}
+	} // end for each class in IDL
 
-    osrfStringArrayFree(classes);
-
+	osrfHashIteratorFree( class_itr );
 	child_initialized = 1;
     return 0;
 }



More information about the open-ils-commits mailing list