[patch 09/15] [gnc-string-cache.diff] Privatization of the string GCache

c.shoemaker at cox.net c.shoemaker at cox.net
Mon Oct 10 10:34:31 EDT 2005


 * src/engine/gnc-engine-util.c                    |   57 ++++++++++++++++-----
 * src/engine/gnc-engine-util.h                    |   44 ++++++++++------
     - Previously, gnc-engine-util exposed direct access to the static
       GCache.  This makes debugging various uses (and misuses) very
       difficult.  Now, the static GCache itself is private, and all
       access is through gnc_string_cache_{remove,insert}().

 * src/app-utils/gnc-component-manager.c           |    8 +--
 * src/business/business-core/gncAddress.c         |    3 -
 * src/business/business-core/gncBillTerm.c        |    3 -
 * src/business/business-core/gncCustomer.c        |    3 -
 * src/business/business-core/gncEmployee.c        |    3 -
 * src/business/business-core/gncEntry.c           |    3 -
 * src/business/business-core/gncInvoice.c         |    3 -
 * src/business/business-core/gncJob.c             |    3 -
 * src/business/business-core/gncOrder.c           |    3 -
 * src/business/business-core/gncTaxTable.c        |    3 -
 * src/business/business-core/gncVendor.c          |    3 -
 * src/business/business-core/test/test-customer.c |   10 +--
 * src/business/business-core/test/test-employee.c |    4 -
 * src/business/business-core/test/test-job.c      |    2 
 * src/business/business-core/test/test-vendor.c   |    2 
 * src/engine/Transaction.c                        |   64 ++++++++++++------------
 * src/engine/gnc-commodity.c                      |   33 ++++--------
 * src/engine/gnc-engine.c                         |    2 
 * src/engine/gnc-pricedb.c                        |   16 ++----
 * src/engine/kvp_frame.c                          |   12 ++--
 * src/engine/qofid.c                              |    3 -
 * src/engine/qofquery-deserial.c                  |    6 --
 * src/engine/test/test-commodities.c              |   24 ++++-----
 * src/gnome-utils/QuickFill.c                     |   18 +-----
   - Convert all gcache users to use only public functions
   - consolidate CACHE_INSERT and CACHE_REMOVE macros into one place

 * src/engine/qofquery-deserial.c
   - annotate one possible bug discovered during the above


 
 src/app-utils/gnc-component-manager.c           |    8 +--
 src/business/business-core/gncAddress.c         |    3 -
 src/business/business-core/gncBillTerm.c        |    3 -
 src/business/business-core/gncCustomer.c        |    3 -
 src/business/business-core/gncEmployee.c        |    3 -
 src/business/business-core/gncEntry.c           |    3 -
 src/business/business-core/gncInvoice.c         |    3 -
 src/business/business-core/gncJob.c             |    3 -
 src/business/business-core/gncOrder.c           |    3 -
 src/business/business-core/gncTaxTable.c        |    3 -
 src/business/business-core/gncVendor.c          |    3 -
 src/business/business-core/test/test-customer.c |   10 +--
 src/business/business-core/test/test-employee.c |    4 -
 src/business/business-core/test/test-job.c      |    2 
 src/business/business-core/test/test-vendor.c   |    2 
 src/engine/Transaction.c                        |   64 ++++++++++++------------
 src/engine/gnc-commodity.c                      |   33 ++++--------
 src/engine/gnc-engine-util.c                    |   57 ++++++++++++++++-----
 src/engine/gnc-engine-util.h                    |   44 ++++++++++------
 src/engine/gnc-engine.c                         |    2 
 src/engine/gnc-pricedb.c                        |   16 ++----
 src/engine/kvp_frame.c                          |   12 ++--
 src/engine/qofid.c                              |    3 -
 src/engine/qofquery-deserial.c                  |    6 --
 src/engine/test/test-commodities.c              |   24 ++++-----
 src/gnome-utils/QuickFill.c                     |   18 +-----
 26 files changed, 153 insertions(+), 182 deletions(-)

Index: gnucash/src/app-utils/gnc-component-manager.c
===================================================================
--- gnucash.orig/src/app-utils/gnc-component-manager.c
+++ gnucash/src/app-utils/gnc-component-manager.c
@@ -64,6 +64,7 @@ typedef struct
 
 /** Static Variables ************************************************/
 static guint  suspend_counter = 0;
+/* Some code foolishly uses 0 instead of NO_COMPONENT, so we start with 1. */
 static gint   next_component_id = 1;
 static GList *components = NULL;
 
@@ -127,9 +128,7 @@ clear_mask_hash (GHashTable *hash)
 static gboolean
 destroy_mask_hash_helper (gpointer key, gpointer value, gpointer user_data)
 {
-  GCache *gc = gnc_engine_get_string_cache ();
-
-  g_cache_remove (gc, key);
+  gnc_string_cache_remove (key);
   g_free (value);
 
   return TRUE;
@@ -246,8 +245,7 @@ add_event_type (ComponentEventInfo *cei,
   mask = g_hash_table_lookup (cei->event_masks, entity_type);
   if (!mask)
   {
-    char * key = g_cache_insert (gnc_engine_get_string_cache (),
-                                 (gpointer) entity_type);
+    char * key = gnc_string_cache_insert ((gpointer) entity_type);
     mask = g_new0 (GNCEngineEventType, 1);
     g_hash_table_insert (cei->event_masks, key, mask);
   }
Index: gnucash/src/business/business-core/gncAddress.c
===================================================================
--- gnucash.orig/src/business/business-core/gncAddress.c
+++ gnucash/src/business/business-core/gncAddress.c
@@ -52,9 +52,6 @@ struct _gncAddress 
 
 #define _GNC_MOD_NAME	GNC_ADDRESS_MODULE_NAME
 
-#define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str));
-#define CACHE_REMOVE(str) g_cache_remove(gnc_engine_get_string_cache(), (str));
-
 G_INLINE_FUNC void mark_address (GncAddress *address);
 void mark_address (GncAddress *address)
 {
Index: gnucash/src/business/business-core/gncBillTerm.c
===================================================================
--- gnucash.orig/src/business/business-core/gncBillTerm.c
+++ gnucash/src/business/business-core/gncBillTerm.c
@@ -66,9 +66,6 @@ static QofLogModule log_module = GNC_MOD
 
 #define _GNC_MOD_NAME        GNC_ID_BILLTERM
 
-#define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str));
-#define CACHE_REMOVE(str) g_cache_remove(gnc_engine_get_string_cache(), (str));
-
 #define SET_STR(obj, member, str) { \
         char * tmp; \
         \
Index: gnucash/src/business/business-core/gncCustomer.c
===================================================================
--- gnucash.orig/src/business/business-core/gncCustomer.c
+++ gnucash/src/business/business-core/gncCustomer.c
@@ -76,9 +76,6 @@ static QofLogModule log_module = GNC_MOD
 /* ============================================================== */
 /* misc inline funcs */
 
-#define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str));
-#define CACHE_REMOVE(str) g_cache_remove(gnc_engine_get_string_cache(), (str));
-
 G_INLINE_FUNC void mark_customer (GncCustomer *customer);
 void mark_customer (GncCustomer *customer)
 {
Index: gnucash/src/business/business-core/gncEmployee.c
===================================================================
--- gnucash.orig/src/business/business-core/gncEmployee.c
+++ gnucash/src/business/business-core/gncEmployee.c
@@ -59,9 +59,6 @@ static QofLogModule log_module = GNC_MOD
 
 #define _GNC_MOD_NAME        GNC_ID_EMPLOYEE
 
-#define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str));
-#define CACHE_REMOVE(str) g_cache_remove(gnc_engine_get_string_cache(), (str));
-
 G_INLINE_FUNC void mark_employee (GncEmployee *employee);
 void mark_employee (GncEmployee *employee)
 {
Index: gnucash/src/business/business-core/gncEntry.c
===================================================================
--- gnucash.orig/src/business/business-core/gncEntry.c
+++ gnucash/src/business/business-core/gncEntry.c
@@ -156,9 +156,6 @@ gboolean gncEntryPaymentStringToType (co
 
 #define _GNC_MOD_NAME	GNC_ID_ENTRY
 
-#define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str));
-#define CACHE_REMOVE(str) g_cache_remove(gnc_engine_get_string_cache(), (str));
-
 #define SET_STR(obj, member, str) { \
 	char * tmp; \
 	\
Index: gnucash/src/business/business-core/gncInvoice.c
===================================================================
--- gnucash.orig/src/business/business-core/gncInvoice.c
+++ gnucash/src/business/business-core/gncInvoice.c
@@ -76,9 +76,6 @@ static QofLogModule log_module = GNC_MOD
 #define GNC_INVOICE_ID		"gncInvoice"
 #define GNC_INVOICE_GUID	"invoice-guid"
 
-#define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str));
-#define CACHE_REMOVE(str) g_cache_remove(gnc_engine_get_string_cache(), (str));
-
 #define SET_STR(obj, member, str) { \
 	char * tmp; \
 	\
Index: gnucash/src/business/business-core/gncJob.c
===================================================================
--- gnucash.orig/src/business/business-core/gncJob.c
+++ gnucash/src/business/business-core/gncJob.c
@@ -54,9 +54,6 @@ static QofLogModule log_module = GNC_MOD
 /* ================================================================== */
 /* misc inline functions */
 
-#define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str));
-#define CACHE_REMOVE(str) g_cache_remove(gnc_engine_get_string_cache(), (str));
-
 G_INLINE_FUNC void mark_job (GncJob *job);
 void mark_job (GncJob *job)
 {
Index: gnucash/src/business/business-core/gncOrder.c
===================================================================
--- gnucash.orig/src/business/business-core/gncOrder.c
+++ gnucash/src/business/business-core/gncOrder.c
@@ -57,9 +57,6 @@ static QofLogModule log_module = GNC_MOD
 
 #define _GNC_MOD_NAME	GNC_ID_ORDER
 
-#define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str));
-#define CACHE_REMOVE(str) g_cache_remove(gnc_engine_get_string_cache(), (str));
-
 #define SET_STR(obj, member, str) { \
 	char * tmp; \
 	\
Index: gnucash/src/business/business-core/gncTaxTable.c
===================================================================
--- gnucash.orig/src/business/business-core/gncTaxTable.c
+++ gnucash/src/business/business-core/gncTaxTable.c
@@ -131,9 +131,6 @@ gncTaxIncludedStringToType (const char *
 
 #define _GNC_MOD_NAME        GNC_ID_TAXTABLE
 
-#define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str));
-#define CACHE_REMOVE(str) g_cache_remove(gnc_engine_get_string_cache(), (str));
-
 #define SET_STR(obj, member, str) { \
         char * tmp; \
         \
Index: gnucash/src/business/business-core/gncVendor.c
===================================================================
--- gnucash.orig/src/business/business-core/gncVendor.c
+++ gnucash/src/business/business-core/gncVendor.c
@@ -65,9 +65,6 @@ static QofLogModule log_module = GNC_MOD
 /* ============================================================ */
 /* Misc inline funcs */
 
-#define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str));
-#define CACHE_REMOVE(str) g_cache_remove(gnc_engine_get_string_cache(), (str));
-
 G_INLINE_FUNC void mark_vendor (GncVendor *vendor);
 void mark_vendor (GncVendor *vendor)
 {
Index: gnucash/src/business/business-core/test/test-customer.c
===================================================================
--- gnucash.orig/src/business/business-core/test/test-customer.c
+++ gnucash/src/business/business-core/test/test-customer.c
@@ -205,17 +205,15 @@ test_bool_fcn (QofBook *book, const char
 int
 main (int argc, char **argv)
 {
-  gnc_engine_get_string_cache ();
   guid_init ();
-	qof_query_init ();
+  qof_query_init ();
   qof_object_initialize ();
   qof_book_register ();
-	do_test (cashobjects_register(), "Cannot register cash objects");
+  do_test (cashobjects_register(), "Cannot register cash objects");
   test_customer();
   print_test_results();
-	qof_query_shutdown();
+  qof_query_shutdown();
   guid_shutdown();
-	qof_object_shutdown ();
-  gnc_engine_string_cache_destroy();
+  qof_object_shutdown ();
   return 0;
 }
Index: gnucash/src/business/business-core/test/test-employee.c
===================================================================
--- gnucash.orig/src/business/business-core/test/test-employee.c
+++ gnucash/src/business/business-core/test/test-employee.c
@@ -217,7 +217,6 @@ test_gint_fcn (QofBook *book, const char
 int
 main (int argc, char **argv)
 {
-  gnc_engine_get_string_cache ();
   guid_init ();
   qof_query_init ();
   qof_object_initialize ();
@@ -225,12 +224,11 @@ main (int argc, char **argv)
   do_test (gncInvoiceRegister(), "Cannot register GncInvoice");
   do_test (gncJobRegister (),  "Cannot register GncJob");
   do_test (gncCustomerRegister(), "Cannot register GncCustomer");
-  do_test (gncEmployeeRegister(), "Cannot register GncEmployee");		
+  do_test (gncEmployeeRegister(), "Cannot register GncEmployee");
   test_employee();
   print_test_results();
   qof_query_shutdown();
   guid_shutdown();
   qof_object_shutdown ();
-  gnc_engine_string_cache_destroy();
   return 0;
 }
Index: gnucash/src/business/business-core/test/test-job.c
===================================================================
--- gnucash.orig/src/business/business-core/test/test-job.c
+++ gnucash/src/business/business-core/test/test-job.c
@@ -234,7 +234,6 @@ test_gint_fcn (QofBook *book, const char
 int
 main (int argc, char **argv)
 {
-  gnc_engine_get_string_cache ();
   guid_init ();
   qof_query_init ();
   qof_object_initialize ();
@@ -247,7 +246,6 @@ main (int argc, char **argv)
   qof_query_shutdown();
   guid_shutdown();
   qof_object_shutdown ();
-  gnc_engine_string_cache_destroy();
   return 0;
 }
 
Index: gnucash/src/business/business-core/test/test-vendor.c
===================================================================
--- gnucash.orig/src/business/business-core/test/test-vendor.c
+++ gnucash/src/business/business-core/test/test-vendor.c
@@ -215,7 +215,6 @@ test_gint_fcn (QofBook *book, const char
 int
 main (int argc, char **argv)
 {
-  gnc_engine_get_string_cache ();
   guid_init ();
   qof_query_init ();
   qof_object_initialize ();
@@ -229,6 +228,5 @@ main (int argc, char **argv)
   qof_query_shutdown();
   guid_shutdown();
   qof_object_shutdown ();
-  gnc_engine_string_cache_destroy();
   return 0;
 }
Index: gnucash/src/engine/Transaction.c
===================================================================
--- gnucash.orig/src/engine/Transaction.c
+++ gnucash/src/engine/Transaction.c
@@ -101,8 +101,8 @@ xaccInitSplit(Split * split, QofBook *bo
   split->parent      = NULL;
   split->lot         = NULL;
 
-  split->action      = g_cache_insert(gnc_engine_get_string_cache(), "");
-  split->memo        = g_cache_insert(gnc_engine_get_string_cache(), "");
+  split->action      = gnc_string_cache_insert("");
+  split->memo        = gnc_string_cache_insert("");
   split->reconciled  = NREC;
   split->amount      = gnc_numeric_zero();
   split->value       = gnc_numeric_zero();
@@ -168,8 +168,8 @@ xaccDupeSplit (Split *s)
   split->acc = s->acc;
   split->lot = s->lot;
 
-  split->memo = g_cache_insert (gnc_engine_get_string_cache(), s->memo);
-  split->action = g_cache_insert (gnc_engine_get_string_cache(), s->action);
+  split->memo = gnc_string_cache_insert(s->memo);
+  split->action = gnc_string_cache_insert(s->action);
 
   split->kvp_data = kvp_frame_copy (s->kvp_data);
 
@@ -196,8 +196,8 @@ xaccSplitClone (Split *s)
 
   split->book                = s->book;
   split->parent              = NULL;
-  split->memo                = g_cache_insert(gnc_engine_get_string_cache(), s->memo);
-  split->action              = g_cache_insert(gnc_engine_get_string_cache(), s->action);
+  split->memo                = gnc_string_cache_insert(s->memo);
+  split->action              = gnc_string_cache_insert(s->action);
   split->kvp_data            = kvp_frame_copy(s->kvp_data);
   split->reconciled          = s->reconciled;
   split->date_reconciled     = s->date_reconciled;
@@ -260,8 +260,8 @@ xaccFreeSplit (Split *split)
     PERR ("double-free %p", split);
     return;
   }
-  g_cache_remove(gnc_engine_get_string_cache(), split->memo);
-  g_cache_remove(gnc_engine_get_string_cache(), split->action);
+  gnc_string_cache_remove(split->memo);
+  gnc_string_cache_remove(split->action);
 
   kvp_frame_delete (split->kvp_data);
   split->kvp_data    = NULL;
@@ -798,8 +798,8 @@ xaccInitTransaction (Transaction * trans
 {
   ENTER ("trans=%p", trans);
   /* Fill in some sane defaults */
-  trans->num         = g_cache_insert(gnc_engine_get_string_cache(), "");
-  trans->description = g_cache_insert(gnc_engine_get_string_cache(), "");
+  trans->num         = gnc_string_cache_insert("");
+  trans->description = gnc_string_cache_insert("");
 
   trans->common_currency = NULL;
   trans->splits = NULL;
@@ -911,8 +911,8 @@ xaccDupeTransaction (Transaction *t)
 
   trans = g_new0 (Transaction, 1);
 
-  trans->num         = g_cache_insert (gnc_engine_get_string_cache(), t->num);
-  trans->description = g_cache_insert (gnc_engine_get_string_cache(), t->description);
+  trans->num         = gnc_string_cache_insert (t->num);
+  trans->description = gnc_string_cache_insert (t->description);
 
   trans->splits = g_list_copy (t->splits);
   for (node = trans->splits; node; node = node->next)
@@ -959,8 +959,8 @@ xaccTransClone (Transaction *t)
 
   trans->date_entered    = t->date_entered;
   trans->date_posted     = t->date_posted;
-  trans->num             = g_cache_insert (gnc_engine_get_string_cache(), t->num);
-  trans->description     = g_cache_insert (gnc_engine_get_string_cache(), t->description);
+  trans->num             = gnc_string_cache_insert (t->num);
+  trans->description     = gnc_string_cache_insert (t->description);
   trans->common_currency = t->common_currency;
   trans->version         = t->version;
   trans->version_check   = t->version_check;
@@ -1010,8 +1010,8 @@ xaccFreeTransaction (Transaction *trans)
   trans->splits = NULL;
 
   /* free up transaction strings */
-  g_cache_remove(gnc_engine_get_string_cache(), trans->num);
-  g_cache_remove(gnc_engine_get_string_cache(), trans->description);
+  gnc_string_cache_remove(trans->num);
+  gnc_string_cache_remove(trans->description);
 
   /* Just in case someone looks up freed memory ... */
   trans->num         = (char *) 1;
@@ -1689,13 +1689,13 @@ xaccTransRollbackEdit (Transaction *tran
 
    trans->common_currency = orig->common_currency;
 
-   g_cache_remove (gnc_engine_get_string_cache(), trans->num);
+   gnc_string_cache_remove (trans->num);
    trans->num = orig->num;
-   orig->num = g_cache_insert(gnc_engine_get_string_cache(), "");
+   orig->num = gnc_string_cache_insert("");
 
-   g_cache_remove (gnc_engine_get_string_cache(), trans->description);
+   gnc_string_cache_remove (trans->description);
    trans->description = orig->description;
-   orig->description = g_cache_insert(gnc_engine_get_string_cache(), "");
+   orig->description = gnc_string_cache_insert("");
 
    kvp_frame_delete (trans->inst.kvp_data);
    trans->inst.kvp_data = orig->inst.kvp_data;
@@ -1741,13 +1741,13 @@ xaccTransRollbackEdit (Transaction *tran
            break;
          }
 
-         g_cache_remove (gnc_engine_get_string_cache(), s->action);
+         gnc_string_cache_remove (s->action);
          s->action = so->action;
-         so->action = g_cache_insert(gnc_engine_get_string_cache(), "");
+         so->action = gnc_string_cache_insert("");
 
-         g_cache_remove (gnc_engine_get_string_cache(), s->memo);
+         gnc_string_cache_remove (s->memo);
          s->memo = so->memo;
-         so->memo = g_cache_insert(gnc_engine_get_string_cache(), "");
+         so->memo = gnc_string_cache_insert("");
 
          kvp_frame_delete (s->kvp_data);
          s->kvp_data = so->kvp_data;
@@ -2477,8 +2477,8 @@ xaccTransSetNum (Transaction *trans, con
    if (!trans || !xnum) return;
    check_open (trans);
 
-   tmp = g_cache_insert(gnc_engine_get_string_cache(), (gpointer) xnum);
-   g_cache_remove(gnc_engine_get_string_cache(), trans->num);
+   tmp = gnc_string_cache_insert((gpointer) xnum);
+   gnc_string_cache_remove(trans->num);
    trans->num = tmp;
 }
 
@@ -2497,8 +2497,8 @@ xaccTransSetDescription (Transaction *tr
    if (!trans || !desc) return;
    check_open (trans);
 
-   tmp = g_cache_insert(gnc_engine_get_string_cache(), (gpointer) desc);
-   g_cache_remove(gnc_engine_get_string_cache(), trans->description);
+   tmp = gnc_string_cache_insert((gpointer) desc);
+   gnc_string_cache_remove(trans->description);
    trans->description = tmp;
 }
 
@@ -2724,8 +2724,8 @@ xaccSplitSetMemo (Split *split, const ch
    if (!split || !memo) return;
    check_open (split->parent);
 
-   tmp = g_cache_insert(gnc_engine_get_string_cache(), (gpointer) memo);
-   g_cache_remove(gnc_engine_get_string_cache(), split->memo);
+   tmp = gnc_string_cache_insert((gpointer) memo);
+   gnc_string_cache_remove(split->memo);
    split->memo = tmp;
 }
 
@@ -2736,8 +2736,8 @@ xaccSplitSetAction (Split *split, const 
    if (!split || !actn) return;
    check_open (split->parent);
 
-   tmp = g_cache_insert(gnc_engine_get_string_cache(), (gpointer) actn);
-   g_cache_remove(gnc_engine_get_string_cache(), split->action);
+   tmp = gnc_string_cache_insert((gpointer) actn);
+   gnc_string_cache_remove(split->action);
    split->action = tmp;
 }
 
Index: gnucash/src/engine/gnc-commodity.c
===================================================================
--- gnucash.orig/src/engine/gnc-commodity.c
+++ gnucash/src/engine/gnc-commodity.c
@@ -447,11 +447,14 @@ gnc_quote_source_set_fq_installed (GList
  * gnc_commodity_new
  ********************************************************************/
 
+/* TODO: convert these to their more conventional form */
+#undef CACHE_INSERT
+#undef CACHE_REMOVE
 #define CACHE_INSERT(dest,src)       \
-  if(src) { dest = g_cache_insert(str_cache, (gpointer)src); }
+  if(src) { dest = gnc_string_cache_insert((gpointer)src); }
 
 #define CACHE_REMOVE(str)     \
-  if(str) { g_cache_remove(str_cache, str); str = NULL; }
+  if(str) { gnc_string_cache_remove(str); str=NULL; }
 
 static void
 mark_commodity_dirty (gnc_commodity *cm)
@@ -488,7 +491,6 @@ gnc_commodity_new(QofBook *book, const c
                   const char * exchange_code, 
                   int fraction)
 {
-  GCache *str_cache = gnc_engine_get_string_cache ();
   gnc_commodity * retval = g_new0(gnc_commodity, 1);
   gnc_commodity_table *table;
 
@@ -526,7 +528,6 @@ gnc_commodity_new(QofBook *book, const c
 void
 gnc_commodity_destroy(gnc_commodity * cm)
 {
-  GCache *str_cache = gnc_engine_get_string_cache ();
   if(!cm) return;
 
   gnc_engine_gen_event (&cm->inst.entity, GNC_EVENT_DESTROY);
@@ -569,7 +570,6 @@ gnc_commodity_copy(gnc_commodity * dest,
 gnc_commodity *
 gnc_commodity_clone(gnc_commodity *src)
 {
-  GCache *str_cache = gnc_engine_get_string_cache ();
   gnc_commodity * dest = g_new0(gnc_commodity, 1);
 
   CACHE_INSERT (dest->fullname, src->fullname);
@@ -739,7 +739,6 @@ gnc_commodity_get_quote_tz(const gnc_com
 void
 gnc_commodity_set_mnemonic(gnc_commodity * cm, const char * mnemonic) 
 {
-  GCache *str_cache = gnc_engine_get_string_cache ();
   if(!cm) return;
   if(cm->mnemonic == mnemonic) return;
 
@@ -782,7 +781,6 @@ gnc_commodity_set_namespace(gnc_commodit
 void
 gnc_commodity_set_fullname(gnc_commodity * cm, const char * fullname) 
 {
-  GCache *str_cache = gnc_engine_get_string_cache ();
   if(!cm) return;
   if(cm->fullname == fullname) return;
 
@@ -801,7 +799,6 @@ void
 gnc_commodity_set_exchange_code(gnc_commodity * cm, 
                                 const char * exchange_code) 
 {
-  GCache *str_cache = gnc_engine_get_string_cache ();
   if(!cm) return;
   if(cm->exchange_code == exchange_code) return;
 
@@ -870,7 +867,6 @@ gnc_commodity_set_quote_source(gnc_commo
 void
 gnc_commodity_set_quote_tz(gnc_commodity *cm, const char *tz) 
 {
-  GCache *str_cache = gnc_engine_get_string_cache ();
   ENTER ("(cm=%p, tz=%s)", cm, tz);
 
   if(!cm) return;
@@ -1173,7 +1169,6 @@ gnc_commodity *
 gnc_commodity_table_insert(gnc_commodity_table * table, 
                            gnc_commodity * comm) 
 {
-  GCache *str_cache;
   gnc_commodity_namespace * nsp = NULL;
   gnc_commodity *c;
   const char *ns_name;
@@ -1197,11 +1192,11 @@ gnc_commodity_table_insert(gnc_commodity
   }
 
   nsp = gnc_commodity_table_add_namespace(table, ns_name);
-  str_cache = gnc_engine_get_string_cache ();
   
-  PINFO ("insert %p %s into nsp=%p %s", comm->mnemonic, comm->mnemonic, nsp->cm_table, nsp->name);
+  PINFO ("insert %p %s into nsp=%p %s", comm->mnemonic, comm->mnemonic,
+         nsp->cm_table, nsp->name);
   g_hash_table_insert(nsp->cm_table, 
-                      (gpointer)g_cache_insert(str_cache, comm->mnemonic),
+                      gnc_string_cache_insert(comm->mnemonic),
                       (gpointer)comm);
   nsp->cm_list = g_list_append(nsp->cm_list, comm);
 
@@ -1432,10 +1427,9 @@ gnc_commodity_table_add_namespace(gnc_co
   ns = gnc_commodity_table_find_namespace(table, namespace);
   if(!ns) 
   {
-    GCache *str_cache = gnc_engine_get_string_cache ();
     ns = g_new0(gnc_commodity_namespace, 1);
     ns->cm_table = g_hash_table_new(g_str_hash, g_str_equal);
-    ns->name = g_cache_insert(str_cache, (gpointer)namespace);
+    ns->name = gnc_string_cache_insert((gpointer)namespace);
     gnc_engine_gen_event (&ns->inst.entity, GNC_EVENT_CREATE);
     
     g_hash_table_insert(table->ns_table,
@@ -1487,10 +1481,9 @@ gnc_commodity_find_namespace_by_guid(con
 static int
 ns_helper(gpointer key, gpointer value, gpointer user_data) 
 {
-  GCache *str_cache = user_data;
   gnc_commodity * c = value;
   gnc_commodity_destroy(c);
-  g_cache_remove (str_cache, key);  /* key is commodity mnemonic */
+  gnc_string_cache_remove(key);  /* key is commodity mnemonic */
   return TRUE;
 }
 
@@ -1499,7 +1492,6 @@ gnc_commodity_table_delete_namespace(gnc
                                      const char * namespace) 
 {
   gnc_commodity_namespace * ns;
-  GCache *str_cache;
 
   if (!table) return;
 
@@ -1514,10 +1506,9 @@ gnc_commodity_table_delete_namespace(gnc
   g_list_free(ns->cm_list);
   ns->cm_list = NULL;
 
-  str_cache = gnc_engine_get_string_cache ();
-  g_hash_table_foreach_remove(ns->cm_table, ns_helper, str_cache);
+  g_hash_table_foreach_remove(ns->cm_table, ns_helper, NULL);
   g_hash_table_destroy(ns->cm_table);
-  g_cache_remove (str_cache, ns->name);
+  gnc_string_cache_remove(ns->name);
 
   gnc_engine_gen_event (&ns->inst.entity, GNC_EVENT_DESTROY);
   g_free(ns);
Index: gnucash/src/engine/gnc-engine-util.c
===================================================================
--- gnucash.orig/src/engine/gnc-engine-util.c
+++ gnucash/src/engine/gnc-engine-util.c
@@ -221,16 +221,43 @@ qof_util_bool_to_int (const char * val)
 
 static GCache * gnc_string_cache = NULL;
 
-/* maybe better to make this function static */
-GCache*
+#ifdef THESE_CAN_BE_USEFUL_FOR_DEGUGGING
+static guint g_str_hash_KEY(gconstpointer v) {
+    return g_str_hash(v);
+}
+static guint g_str_hash_VAL(gconstpointer v) {
+    return g_str_hash(v);
+}
+static gpointer g_strdup_VAL(gpointer v) {
+    return g_strdup(v);
+}
+static gpointer g_strdup_KEY(gpointer v) {
+    return g_strdup(v);
+}
+static void g_free_VAL(gpointer v) {
+    return g_free(v);
+}
+static void g_free_KEY(gpointer v) {
+    return g_free(v);
+}
+static gboolean gnc_str_equal(gconstpointer v, gconstpointer v2)
+{
+    return (v && v2) ? g_str_equal(v, v2) : FALSE;
+}
+#endif
+
+static GCache*
 gnc_engine_get_string_cache(void)
 {
-    if(!gnc_string_cache) 
-    {
+    if(!gnc_string_cache) {
         gnc_string_cache = g_cache_new(
-            (GCacheNewFunc) g_strdup, g_free,
-            (GCacheDupFunc) g_strdup, g_free, g_str_hash, 
-            g_str_hash, g_str_equal);
+            (GCacheNewFunc) g_strdup, /* value_new_func     */
+            g_free,                   /* value_destroy_func */
+            (GCacheDupFunc) g_strdup, /* key_dup_func       */
+            g_free,                   /* key_destroy_func   */
+            g_str_hash,               /* hash_key_func      */
+            g_str_hash,               /* hash_value_func    */
+            g_str_equal);             /* key_equal_func     */
     }
     return gnc_string_cache;
 }
@@ -238,18 +265,22 @@ gnc_engine_get_string_cache(void)
 void
 gnc_engine_string_cache_destroy (void)
 {
-  g_cache_destroy (gnc_string_cache);
-  gnc_string_cache = NULL;
+    if (gnc_string_cache)
+        g_cache_destroy (gnc_string_cache);
+    gnc_string_cache = NULL;
 }
 
-void gnc_string_cache_remove(gpointer key)
+void
+gnc_string_cache_remove(gconstpointer key)
 {
-  g_cache_remove(gnc_engine_get_string_cache(), key);
+    g_cache_remove(gnc_engine_get_string_cache(), key);
 }
 
-gpointer gnc_string_cache_insert(gpointer key)
+
+gpointer
+gnc_string_cache_insert(gpointer key)
 {
-  return g_cache_insert(gnc_engine_get_string_cache(), key);
+    return g_cache_insert(gnc_engine_get_string_cache(), key);
 }
 
 void
Index: gnucash/src/engine/gnc-engine-util.h
===================================================================
--- gnucash.orig/src/engine/gnc-engine-util.h
+++ gnucash/src/engine/gnc-engine-util.h
@@ -211,38 +211,48 @@ const char * qof_util_whitespace_filter 
  *  return that number. (Leading whitespace is ignored). */
 int qof_util_bool_to_int (const char * val);
 
-/** Many strings used throughout the engine are likely to be duplicated.
+
+/** Gnucash's String Cache:
+ *
+ * Many strings used throughout the engine are likely to be duplicated.
  * So we provide a reference counted cache system for the strings, which
  * shares strings whenever possible.
  *
- * Use g_cache_insert to insert a string into the cache (it will return a
- * pointer to the cached string).
- * Basically you should use this instead of g_strdup.
- *
- * Use g_cache_remove (giving it a pointer to a cached string) if the string
- * is unused.  If this is the last reference to the string it will be
- * removed from the cache, otherwise it will just decrement the
- * reference count.
- * Basically you should use this instead of g_free.
+ * Use gnc_string_cache_insert to insert a string into the cache (it
+ * will return a pointer to the cached string).  Basically you should
+ * use this instead of g_strdup.
+ *
+ * Use gnc_string_cache_remove (giving it a pointer to a cached
+ * string) if the string is unused.  If this is the last reference to
+ * the string it will be removed from the cache, otherwise it will
+ * just decrement the reference count.  Basically you should use this
+ * instead of g_free.
+ *
+ * Just in case it's not clear: The remove function must NOT be called
+ * for the string you passed INTO the insert function.  It must be
+ * called for the _cached_ string that is _returned_ by the insert
+ * function.
  *
  * Note that all the work is done when inserting or removing.  Once
  * cached the strings are just plain C strings.
- */
-
-/** Get the gnc_string_cache.  Create it if it doesn't exist already
-
-\todo hide the gcache as a static */
-GCache* gnc_engine_get_string_cache(void);
+ *
+ * The string cache is demand-created on first use.
+ *
+ **/
 
+/** Destroy the gnc_string_cache */
 void gnc_engine_string_cache_destroy (void);
 
 /* You can use this function as a destroy notifier for a GHashTable
    that uses common strings as keys (or values, for that matter.) */
-void gnc_string_cache_remove(gpointer key);
+void gnc_string_cache_remove(gconstpointer key);
 
 /* You can use this function with g_hash_table_insert(), or the key
    (or value), as long as you use the destroy notifier above. */
 gpointer gnc_string_cache_insert(gpointer key);
 
+#define CACHE_INSERT(str) gnc_string_cache_insert((gpointer)(str));
+#define CACHE_REMOVE(str) gnc_string_cache_remove((str));
+
 #endif /* QOF_UTIL_H */
 /** @} */
Index: gnucash/src/engine/gnc-engine.c
===================================================================
--- gnucash.orig/src/engine/gnc-engine.c
+++ gnucash/src/engine/gnc-engine.c
@@ -84,8 +84,6 @@ gnc_engine_init(int argc, char ** argv)
   gnc_set_log_level(GNC_MOD_IO, GNC_LOG_WARNING);
   gnc_set_log_level(GNC_MOD_GUI, GNC_LOG_WARNING);
   qof_log_set_default(GNC_LOG_WARNING);
-  /* initialize the string cache */
-  gnc_engine_get_string_cache();
   
   guid_init ();
   qof_object_initialize ();
Index: gnucash/src/engine/gnc-pricedb.c
===================================================================
--- gnucash.orig/src/engine/gnc-pricedb.c
+++ gnucash/src/engine/gnc-pricedb.c
@@ -67,8 +67,8 @@ gnc_price_destroy (GNCPrice *p)
   ENTER(" ");
   gnc_engine_gen_event (&p->inst.entity, GNC_EVENT_DESTROY);
 
-  if(p->type) g_cache_remove(gnc_engine_get_string_cache(), p->type);
-  if(p->source) g_cache_remove(gnc_engine_get_string_cache(), p->source);
+  if(p->type) gnc_string_cache_remove(p->type);
+  if(p->source) gnc_string_cache_remove(p->source);
 
   qof_instance_release (&p->inst);
   memset(p, 0, sizeof(GNCPrice));
@@ -243,13 +243,11 @@ gnc_price_set_source(GNCPrice *p, const 
   if(!p) return;
   if(safe_strcmp(p->source, s) != 0)
   {
-    GCache *cache;
     char *tmp;
 
     gnc_price_begin_edit (p);
-    cache = gnc_engine_get_string_cache();
-    tmp = g_cache_insert(cache, (gpointer) s);
-    if(p->source) g_cache_remove(cache, p->source);
+    tmp = gnc_string_cache_insert((gpointer) s);
+    if(p->source) gnc_string_cache_remove(p->source);
     p->source = tmp;
     if(p->db) p->db->inst.dirty = TRUE;
     gnc_price_commit_edit (p);
@@ -262,13 +260,11 @@ gnc_price_set_type(GNCPrice *p, const ch
   if(!p) return;
   if(safe_strcmp(p->type, type) != 0)
   {
-    GCache *cache;
     gchar *tmp;
 
     gnc_price_begin_edit (p);
-    cache = gnc_engine_get_string_cache();
-    tmp = g_cache_insert(cache, (gpointer) type);
-    if(p->type) g_cache_remove(cache, p->type);
+    tmp = gnc_string_cache_insert((gpointer) type);
+    if(p->type) gnc_string_cache_remove(p->type);
     p->type = tmp;
     if(p->db) p->db->inst.dirty = TRUE;
     gnc_price_commit_edit (p);
Index: gnucash/src/engine/kvp_frame.c
===================================================================
--- gnucash.orig/src/engine/kvp_frame.c
+++ gnucash/src/engine/kvp_frame.c
@@ -43,6 +43,8 @@
   * (gnc_string_cache), as it is very likely we will see the 
   * same keys over and over again  */
 
+/* TODO: set the cache handling functions with hash_table_new_full */
+
 struct _KvpFrame 
 {
   GHashTable  * hash;
@@ -113,7 +115,7 @@ kvp_frame_new(void) 
 static void
 kvp_frame_delete_worker(gpointer key, gpointer value, gpointer user_data) 
 {
-  g_cache_remove(gnc_engine_get_string_cache(), key);
+  gnc_string_cache_remove(key);
   kvp_value_delete((KvpValue *)value);  
 }
 
@@ -148,7 +150,7 @@ kvp_frame_copy_worker(gpointer key, gpoi
 {
   KvpFrame * dest = (KvpFrame *)user_data;
   g_hash_table_insert(dest->hash,
-                      (gpointer)g_cache_insert(gnc_engine_get_string_cache(), key), 
+                      gnc_string_cache_insert(key),
                       (gpointer)kvp_value_copy(value));
 }
 
@@ -189,7 +191,7 @@ kvp_frame_replace_slot_nc (KvpFrame * fr
   if(key_exists) 
   {
     g_hash_table_remove(frame->hash, slot);
-    g_cache_remove(gnc_engine_get_string_cache(), orig_key);
+    gnc_string_cache_remove(orig_key);
   }
   else
   {
@@ -199,8 +201,7 @@ kvp_frame_replace_slot_nc (KvpFrame * fr
   if(new_value) 
   {
     g_hash_table_insert(frame->hash,
-                        g_cache_insert(gnc_engine_get_string_cache(),
-                                       (gpointer) slot),
+                        gnc_string_cache_insert((gpointer) slot),
                         new_value);
   }
 
@@ -1745,6 +1746,7 @@ kvp_value_to_string(const KvpValue *val)
         break;
 
     case KVP_TYPE_GUID:
+        /* THREAD-UNSAFE */
         ctmp = guid_to_string(kvp_value_get_guid(val));
         tmp2 = g_strdup_printf("KVP_VALUE_GUID(%s)", ctmp ? ctmp : "");
         return tmp2;
Index: gnucash/src/engine/qofid.c
===================================================================
--- gnucash.orig/src/engine/qofid.c
+++ gnucash/src/engine/qofid.c
@@ -32,9 +32,6 @@
 #include "gnc-trace.h"
 #include "gnc-engine-util.h"
 
-#define CACHE_INSERT(str) g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str));
-#define CACHE_REMOVE(str) g_cache_remove(gnc_engine_get_string_cache(), (gpointer)(str));
-
 static QofLogModule log_module = QOF_MOD_ENGINE;
 
 struct QofCollection_s
Index: gnucash/src/engine/qofquery-deserial.c
===================================================================
--- gnucash.orig/src/engine/qofquery-deserial.c
+++ gnucash/src/engine/qofquery-deserial.c
@@ -33,11 +33,6 @@
 #include "qofquerycore-p.h"
 #include "gnc-engine-util.h"
 
-#define CACHE_INSERT(str)  \
-    g_cache_insert(gnc_engine_get_string_cache(), (gpointer)(str))
-#define CACHE_REMOVE(str)  \
-    g_cache_remove(gnc_engine_get_string_cache(), (gpointer)(str))
-
 /* =========================================================== */
 
 #define GET_TEXT(node)  ({                                   \
@@ -483,6 +478,7 @@ qof_query_param_path_from_xml (xmlNodePt
 		if (0 == strcmp (node->name, "qofquery:param"))
 		{
 			const char *str = GET_TEXT (node);
+                        /* BUG? I can't find the matching cache removal. */
 			plist = g_slist_append (plist, CACHE_INSERT(str));
 		}
 	}
Index: gnucash/src/engine/test/test-commodities.c
===================================================================
--- gnucash.orig/src/engine/test/test-commodities.c
+++ gnucash/src/engine/test/test-commodities.c
@@ -179,17 +179,15 @@ test_commodity(void)
 int
 main (int argc, char **argv)
 {
-	gnc_engine_get_string_cache ();
-	guid_init ();
-	qof_object_initialize ();
-	qof_query_init ();
-	qof_book_register ();
-	gnc_commodity_table_register();
-	test_commodity();
-	print_test_results();
-	qof_query_shutdown();
-	guid_shutdown();
-	qof_object_shutdown ();
-	gnc_engine_string_cache_destroy();
-  return 0;
+    guid_init ();
+    qof_object_initialize ();
+    qof_query_init ();
+    qof_book_register ();
+    gnc_commodity_table_register();
+    test_commodity();
+    print_test_results();
+    qof_query_shutdown();
+    guid_shutdown();
+    qof_object_shutdown ();
+    return 0;
 }
Index: gnucash/src/gnome-utils/QuickFill.c
===================================================================
--- gnucash.orig/src/gnome-utils/QuickFill.c
+++ gnucash/src/gnome-utils/QuickFill.c
@@ -49,10 +49,6 @@ static void quickfill_insert_recursive (
 /* This static indicates the debugging module that this .o belongs to.  */
 static QofLogModule log_module = GNC_MOD_REGISTER;
 
-/* A cache for quickfill strings */
-static GCache * qf_string_cache = NULL;
-
-
 /********************************************************************\
 \********************************************************************/
 
@@ -85,10 +81,6 @@ gnc_quickfill_new (void)
     return NULL;
   }
 
-  /* For now, use the engine cache. */
-  if (qf_string_cache == NULL)
-    qf_string_cache = gnc_engine_get_string_cache ();
-
   qf = g_new (QuickFill, 1);
 
   qf->text = NULL;
@@ -120,7 +112,7 @@ gnc_quickfill_destroy (QuickFill *qf)
   qf->matches = NULL;
 
   if (qf->text)
-    g_cache_remove (qf_string_cache, qf->text);
+    gnc_string_cache_remove(qf->text);
   qf->text = NULL;
   qf->len = 0;
 
@@ -136,7 +128,7 @@ gnc_quickfill_purge (QuickFill *qf)
   g_hash_table_foreach_remove (qf->matches, destroy_helper, NULL);
 
   if (qf->text)
-    g_cache_remove (qf_string_cache, qf->text);
+    gnc_string_cache_remove (qf->text);
   qf->text = NULL;
   qf->len = 0;
 }
@@ -318,7 +310,7 @@ quickfill_insert_recursive (QuickFill *q
       /* If there's no string there already, just put the new one in. */
       if (old_text == NULL)
       {
-        match_qf->text = g_cache_insert (qf_string_cache, (gpointer) text);
+        match_qf->text = gnc_string_cache_insert((gpointer) text);
         match_qf->len = len;
         break;
       }
@@ -328,8 +320,8 @@ quickfill_insert_recursive (QuickFill *q
           (strncmp(text, old_text, strlen(old_text)) == 0))
         break;
 
-      g_cache_remove (qf_string_cache, old_text);
-      match_qf->text = g_cache_insert (qf_string_cache, (gpointer) text);
+      gnc_string_cache_remove(old_text);
+      match_qf->text = gnc_string_cache_insert((gpointer) text);
       match_qf->len = len;
       break;
   }

--


More information about the gnucash-devel mailing list