r23194 - gnucash/branches/2.4/src - [r23192]Bug 632362 - Unable to create "reversing transaction" again after it is removed

John Ralls jralls at code.gnucash.org
Tue Sep 24 16:32:23 EDT 2013


Author: jralls
Date: 2013-09-24 16:32:22 -0400 (Tue, 24 Sep 2013)
New Revision: 23194
Trac: http://svn.gnucash.org/trac/changeset/23194

Modified:
   gnucash/branches/2.4/src/engine/Account.c
   gnucash/branches/2.4/src/engine/SchedXaction.c
   gnucash/branches/2.4/src/engine/Split.c
   gnucash/branches/2.4/src/engine/Transaction.c
   gnucash/branches/2.4/src/engine/gnc-commodity.c
   gnucash/branches/2.4/src/engine/gnc-pricedb.c
   gnucash/branches/2.4/src/engine/gncEmployee.c
   gnucash/branches/2.4/src/engine/gncVendor.c
   gnucash/branches/2.4/src/gnome-utils/gnc-plugin-page.c
   gnucash/branches/2.4/src/libqof/qof/qofinstance.c
   gnucash/branches/2.4/src/register/register-gnome/gnucash-cursor.c
   gnucash/branches/2.4/src/register/register-gnome/gnucash-grid.c
   gnucash/branches/2.4/src/register/register-gnome/gnucash-header.c
   gnucash/branches/2.4/src/register/register-gnome/gnucash-item-edit.c
Log:
[r23192]Bug 632362 - Unable to create "reversing transaction" again after it is removed

>From leaking references in g_object_get because both g_object_get
and g_value_set_object ref the object, which is only unreffed once.
Using g_value_take_object() instead prevents the double-ref.

Modified: gnucash/branches/2.4/src/engine/Account.c
===================================================================
--- gnucash/branches/2.4/src/engine/Account.c	2013-09-24 20:32:11 UTC (rev 23193)
+++ gnucash/branches/2.4/src/engine/Account.c	2013-09-24 20:32:22 UTC (rev 23194)
@@ -338,6 +338,12 @@
     G_OBJECT_CLASS(gnc_account_parent_class)->finalize(acctp);
 }
 
+/* Note that g_value_set_object() refs the object, as does
+ * g_object_get(). But g_object_get() only unrefs once when it disgorges
+ * the object, leaving an unbalanced ref, which leaks. So instead of
+ * using g_value_set_object(), use g_value_take_object() which doesn't
+ * ref the object when used in get_property().
+ */
 static void
 gnc_account_get_property (GObject         *object,
                           guint            prop_id,
@@ -376,7 +382,7 @@
         g_value_set_int(value, priv->type);
         break;
     case PROP_COMMODITY:
-        g_value_set_object(value, priv->commodity);
+        g_value_take_object(value, priv->commodity);
         break;
     case PROP_COMMODITY_SCU:
         g_value_set_int(value, priv->commodity_scu);

Modified: gnucash/branches/2.4/src/engine/SchedXaction.c
===================================================================
--- gnucash/branches/2.4/src/engine/SchedXaction.c	2013-09-24 20:32:11 UTC (rev 23193)
+++ gnucash/branches/2.4/src/engine/SchedXaction.c	2013-09-24 20:32:22 UTC (rev 23194)
@@ -95,6 +95,12 @@
     G_OBJECT_CLASS(gnc_schedxaction_parent_class)->finalize(sxp);
 }
 
+/* Note that g_value_set_object() refs the object, as does
+ * g_object_get(). But g_object_get() only unrefs once when it disgorges
+ * the object, leaving an unbalanced ref, which leaks. So instead of
+ * using g_value_set_object(), use g_value_take_object() which doesn't
+ * ref the object when used in get_property().
+ */
 static void
 gnc_schedxaction_get_property (GObject         *object,
                                guint            prop_id,
@@ -151,7 +157,7 @@
         g_value_set_int(value, sx->instance_num);
         break;
     case PROP_TEMPLATE_ACCOUNT:
-        g_value_set_object(value, sx->template_acct);
+        g_value_take_object(value, sx->template_acct);
         break;
     default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);

Modified: gnucash/branches/2.4/src/engine/Split.c
===================================================================
--- gnucash/branches/2.4/src/engine/Split.c	2013-09-24 20:32:11 UTC (rev 23193)
+++ gnucash/branches/2.4/src/engine/Split.c	2013-09-24 20:32:22 UTC (rev 23194)
@@ -112,7 +112,12 @@
 {
     G_OBJECT_CLASS(gnc_split_parent_class)->finalize(splitp);
 }
-
+/* Note that g_value_set_object() refs the object, as does
+ * g_object_get(). But g_object_get() only unrefs once when it disgorges
+ * the object, leaving an unbalanced ref, which leaks. So instead of
+ * using g_value_set_object(), use g_value_take_object() which doesn't
+ * ref the object when used in get_property().
+ */
 static void
 gnc_split_get_property(GObject         *object,
                        guint            prop_id,
@@ -142,13 +147,13 @@
         g_value_set_boxed(value, &split->date_reconciled);
         break;
     case PROP_TX:
-        g_value_set_object(value, split->parent);
+        g_value_take_object(value, split->parent);
         break;
     case PROP_ACCOUNT:
-        g_value_set_object(value, split->acc);
+        g_value_take_object(value, split->acc);
         break;
     case PROP_LOT:
-        g_value_set_object(value, split->lot);
+        g_value_take_object(value, split->lot);
         break;
     default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);

Modified: gnucash/branches/2.4/src/engine/Transaction.c
===================================================================
--- gnucash/branches/2.4/src/engine/Transaction.c	2013-09-24 20:32:11 UTC (rev 23193)
+++ gnucash/branches/2.4/src/engine/Transaction.c	2013-09-24 20:32:22 UTC (rev 23194)
@@ -289,6 +289,12 @@
     G_OBJECT_CLASS(gnc_transaction_parent_class)->finalize(txnp);
 }
 
+/* Note that g_value_set_object() refs the object, as does
+ * g_object_get(). But g_object_get() only unrefs once when it disgorges
+ * the object, leaving an unbalanced ref, which leaks. So instead of
+ * using g_value_set_object(), use g_value_take_object() which doesn't
+ * ref the object when used in get_property().
+ */
 static void
 gnc_transaction_get_property(GObject* object,
                              guint prop_id,
@@ -309,7 +315,7 @@
         g_value_set_string(value, tx->description);
         break;
     case PROP_CURRENCY:
-        g_value_set_object(value, tx->common_currency);
+        g_value_take_object(value, tx->common_currency);
         break;
     case PROP_POST_DATE:
         g_value_set_boxed(value, &tx->date_posted);

Modified: gnucash/branches/2.4/src/engine/gnc-commodity.c
===================================================================
--- gnucash/branches/2.4/src/engine/gnc-commodity.c	2013-09-24 20:32:11 UTC (rev 23193)
+++ gnucash/branches/2.4/src/engine/gnc-commodity.c	2013-09-24 20:32:22 UTC (rev 23194)
@@ -638,7 +638,12 @@
 {
     G_OBJECT_CLASS(gnc_commodity_parent_class)->finalize(comp);
 }
-
+/* Note that g_value_set_object() refs the object, as does
+ * g_object_get(). But g_object_get() only unrefs once when it disgorges
+ * the object, leaving an unbalanced ref, which leaks. So instead of
+ * using g_value_set_object(), use g_value_take_object() which doesn't
+ * ref the object when used in get_property().
+ */
 static void
 gnc_commodity_get_property (GObject         *object,
                             guint            prop_id,
@@ -655,7 +660,7 @@
     switch (prop_id)
     {
     case PROP_NAMESPACE:
-        g_value_set_object(value, priv->namespace);
+        g_value_take_object(value, priv->namespace);
         break;
     case PROP_FULL_NAME:
         g_value_set_string(value, priv->fullname);

Modified: gnucash/branches/2.4/src/engine/gnc-pricedb.c
===================================================================
--- gnucash/branches/2.4/src/engine/gnc-pricedb.c	2013-09-24 20:32:11 UTC (rev 23193)
+++ gnucash/branches/2.4/src/engine/gnc-pricedb.c	2013-09-24 20:32:22 UTC (rev 23194)
@@ -70,6 +70,12 @@
     G_OBJECT_CLASS(gnc_price_parent_class)->finalize(pricep);
 }
 
+/* Note that g_value_set_object() refs the object, as does
+ * g_object_get(). But g_object_get() only unrefs once when it disgorges
+ * the object, leaving an unbalanced ref, which leaks. So instead of
+ * using g_value_set_object(), use g_value_take_object() which doesn't
+ * ref the object when used in get_property().
+ */
 static void
 gnc_price_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec)
 {
@@ -90,10 +96,10 @@
         g_value_set_boxed(value, &price->value);
         break;
     case PROP_COMMODITY:
-        g_value_set_object(value, price->commodity);
+        g_value_take_object(value, price->commodity);
         break;
     case PROP_CURRENCY:
-        g_value_set_object(value, price->currency);
+        g_value_take_object(value, price->currency);
         break;
     case PROP_DATE:
         g_value_set_boxed(value, &price->tmspec);

Modified: gnucash/branches/2.4/src/engine/gncEmployee.c
===================================================================
--- gnucash/branches/2.4/src/engine/gncEmployee.c	2013-09-24 20:32:11 UTC (rev 23193)
+++ gnucash/branches/2.4/src/engine/gncEmployee.c	2013-09-24 20:32:22 UTC (rev 23194)
@@ -102,6 +102,12 @@
     G_OBJECT_CLASS(gnc_employee_parent_class)->finalize(empp);
 }
 
+/* Note that g_value_set_object() refs the object, as does
+ * g_object_get(). But g_object_get() only unrefs once when it disgorges
+ * the object, leaving an unbalanced ref, which leaks. So instead of
+ * using g_value_set_object(), use g_value_take_object() which doesn't
+ * ref the object when used in get_property().
+ */
 static void
 gnc_employee_get_property (GObject         *object,
                            guint            prop_id,

Modified: gnucash/branches/2.4/src/engine/gncVendor.c
===================================================================
--- gnucash/branches/2.4/src/engine/gncVendor.c	2013-09-24 20:32:11 UTC (rev 23193)
+++ gnucash/branches/2.4/src/engine/gncVendor.c	2013-09-24 20:32:22 UTC (rev 23194)
@@ -108,6 +108,12 @@
     G_OBJECT_CLASS(gnc_vendor_parent_class)->finalize(vendorp);
 }
 
+/* Note that g_value_set_object() refs the object, as does
+ * g_object_get(). But g_object_get() only unrefs once when it disgorges
+ * the object, leaving an unbalanced ref, which leaks. So instead of
+ * using g_value_set_object(), use g_value_take_object() which doesn't
+ * ref the object when used in get_property().
+ */
 static void
 gnc_vendor_get_property (GObject         *object,
                          guint            prop_id,

Modified: gnucash/branches/2.4/src/gnome-utils/gnc-plugin-page.c
===================================================================
--- gnucash/branches/2.4/src/gnome-utils/gnc-plugin-page.c	2013-09-24 20:32:11 UTC (rev 23193)
+++ gnucash/branches/2.4/src/gnome-utils/gnc-plugin-page.c	2013-09-24 20:32:22 UTC (rev 23194)
@@ -605,6 +605,12 @@
  *
  *  @param pspec A pointer to the meta data that described the property
  *  being retrieved. */
+/* Note that g_value_set_object() refs the object, as does
+ * g_object_get(). But g_object_get() only unrefs once when it disgorges
+ * the object, leaving an unbalanced ref, which leaks. So instead of
+ * using g_value_set_object(), use g_value_take_object() which doesn't
+ * ref the object when used in get_property().
+ */
 static void
 gnc_plugin_page_get_property (GObject     *object,
                               guint        prop_id,
@@ -639,10 +645,10 @@
         g_value_set_string (value, priv->ui_description);
         break;
     case PROP_UI_MERGE:
-        g_value_set_object (value, priv->ui_merge);
+        g_value_take_object (value, priv->ui_merge);
         break;
     case PROP_ACTION_GROUP:
-        g_value_set_object (value, priv->action_group);
+        g_value_take_object (value, priv->action_group);
         break;
     default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);

Modified: gnucash/branches/2.4/src/libqof/qof/qofinstance.c
===================================================================
--- gnucash/branches/2.4/src/libqof/qof/qofinstance.c	2013-09-24 20:32:11 UTC (rev 23193)
+++ gnucash/branches/2.4/src/libqof/qof/qofinstance.c	2013-09-24 20:32:22 UTC (rev 23194)
@@ -353,6 +353,12 @@
     priv->dirty = FALSE;
 }
 
+/* Note that g_value_set_object() refs the object, as does
+ * g_object_get(). But g_object_get() only unrefs once when it disgorges
+ * the object, leaving an unbalanced ref, which leaks. So instead of
+ * using g_value_set_object(), use g_value_take_object() which doesn't
+ * ref the object when used in get_property().
+ */
 static void
 qof_instance_get_property (GObject         *object,
                            guint            prop_id,
@@ -376,7 +382,7 @@
         g_value_set_pointer(value, priv->collection);
         break;
     case PROP_BOOK:
-        g_value_set_object(value, priv->book);
+        g_value_take_object(value, priv->book);
         break;
     case PROP_KVP_DATA:
         g_value_set_pointer(value, inst->kvp_data);

Modified: gnucash/branches/2.4/src/register/register-gnome/gnucash-cursor.c
===================================================================
--- gnucash/branches/2.4/src/register/register-gnome/gnucash-cursor.c	2013-09-24 20:32:11 UTC (rev 23193)
+++ gnucash/branches/2.4/src/register/register-gnome/gnucash-cursor.c	2013-09-24 20:32:22 UTC (rev 23194)
@@ -468,6 +468,12 @@
 }
 
 
+/* Note that g_value_set_object() refs the object, as does
+ * g_object_get(). But g_object_get() only unrefs once when it disgorges
+ * the object, leaving an unbalanced ref, which leaks. So instead of
+ * using g_value_set_object(), use g_value_take_object() which doesn't
+ * ref the object when used in get_property().
+ */
 static void
 gnucash_cursor_get_property (GObject         *object,
                              guint            prop_id,
@@ -483,10 +489,10 @@
     switch (prop_id)
     {
     case PROP_SHEET:
-        g_value_set_object (value, cursor->sheet);
+        g_value_take_object (value, cursor->sheet);
         break;
     case PROP_GRID:
-        g_value_set_object (value, cursor->grid);
+        g_value_take_object (value, cursor->grid);
         break;
     default:
         break;

Modified: gnucash/branches/2.4/src/register/register-gnome/gnucash-grid.c
===================================================================
--- gnucash/branches/2.4/src/register/register-gnome/gnucash-grid.c	2013-09-24 20:32:11 UTC (rev 23193)
+++ gnucash/branches/2.4/src/register/register-gnome/gnucash-grid.c	2013-09-24 20:32:22 UTC (rev 23194)
@@ -698,6 +698,12 @@
 }
 
 
+/* Note that g_value_set_object() refs the object, as does
+ * g_object_get(). But g_object_get() only unrefs once when it disgorges
+ * the object, leaving an unbalanced ref, which leaks. So instead of
+ * using g_value_set_object(), use g_value_take_object() which doesn't
+ * ref the object when used in get_property().
+ */
 static void
 gnucash_grid_get_property (GObject         *object,
                            guint            prop_id,
@@ -713,7 +719,7 @@
     switch (prop_id)
     {
     case PROP_SHEET:
-        g_value_set_object (value, grid->sheet);
+        g_value_take_object (value, grid->sheet);
         break;
     default:
         break;

Modified: gnucash/branches/2.4/src/register/register-gnome/gnucash-header.c
===================================================================
--- gnucash/branches/2.4/src/register/register-gnome/gnucash-header.c	2013-09-24 20:32:11 UTC (rev 23193)
+++ gnucash/branches/2.4/src/register/register-gnome/gnucash-header.c	2013-09-24 20:32:22 UTC (rev 23194)
@@ -596,6 +596,12 @@
 }
 
 
+/* Note that g_value_set_object() refs the object, as does
+ * g_object_get(). But g_object_get() only unrefs once when it disgorges
+ * the object, leaving an unbalanced ref, which leaks. So instead of
+ * using g_value_set_object(), use g_value_take_object() which doesn't
+ * ref the object when used in get_property().
+ */
 static void
 gnc_header_get_property (GObject *object,
                          guint param_id,
@@ -607,7 +613,7 @@
     switch (param_id)
     {
     case PROP_SHEET:
-        g_value_set_object (value, header->sheet);
+        g_value_take_object (value, header->sheet);
         break;
     case PROP_CURSOR_NAME:
         g_value_set_string (value, header->cursor_name);

Modified: gnucash/branches/2.4/src/register/register-gnome/gnucash-item-edit.c
===================================================================
--- gnucash/branches/2.4/src/register/register-gnome/gnucash-item-edit.c	2013-09-24 20:32:11 UTC (rev 23193)
+++ gnucash/branches/2.4/src/register/register-gnome/gnucash-item-edit.c	2013-09-24 20:32:22 UTC (rev 23194)
@@ -1084,6 +1084,12 @@
     item_edit->popup_toggle.signals_connected = FALSE;
 }
 
+/* Note that g_value_set_object() refs the object, as does
+ * g_object_get(). But g_object_get() only unrefs once when it disgorges
+ * the object, leaving an unbalanced ref, which leaks. So instead of
+ * using g_value_set_object(), use g_value_take_object() which doesn't
+ * ref the object when used in get_property().
+ */
 static void
 gnc_item_edit_get_property (GObject *object,
                             guint param_id,
@@ -1095,10 +1101,10 @@
     switch (param_id)
     {
     case PROP_SHEET:
-        g_value_set_object (value, item_edit->sheet);
+        g_value_take_object (value, item_edit->sheet);
         break;
     case PROP_EDITOR:
-        g_value_set_object (value, item_edit->editor);
+        g_value_take_object (value, item_edit->editor);
         break;
     default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);



More information about the gnucash-changes mailing list