mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
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. BP git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@23192 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
parent
378a419f8d
commit
84e4edcb67
@ -268,6 +268,12 @@ gnc_account_finalize(GObject* acctp)
|
||||
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,
|
||||
@ -306,7 +312,7 @@ gnc_account_get_property (GObject *object,
|
||||
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);
|
||||
|
@ -92,6 +92,12 @@ gnc_schedxaction_finalize(GObject* sxp)
|
||||
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,
|
||||
@ -148,7 +154,7 @@ gnc_schedxaction_get_property (GObject *object,
|
||||
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);
|
||||
|
@ -113,7 +113,12 @@ gnc_split_finalize(GObject* splitp)
|
||||
{
|
||||
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,
|
||||
@ -143,13 +148,13 @@ gnc_split_get_property(GObject *object,
|
||||
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);
|
||||
|
@ -289,6 +289,12 @@ gnc_transaction_finalize(GObject* txnp)
|
||||
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 @@ gnc_transaction_get_property(GObject* object,
|
||||
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);
|
||||
|
@ -626,7 +626,12 @@ gnc_commodity_finalize(GObject* comp)
|
||||
{
|
||||
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,
|
||||
@ -643,7 +648,7 @@ gnc_commodity_get_property (GObject *object,
|
||||
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);
|
||||
|
@ -73,6 +73,12 @@ gnc_price_finalize(GObject* pricep)
|
||||
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)
|
||||
{
|
||||
@ -93,10 +99,10 @@ gnc_price_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec
|
||||
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);
|
||||
|
@ -111,6 +111,12 @@ gnc_employee_finalize(GObject* empp)
|
||||
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,
|
||||
@ -137,13 +143,13 @@ gnc_employee_get_property (GObject *object,
|
||||
g_value_set_string(value, emp->language);
|
||||
break;
|
||||
case PROP_CURRENCY:
|
||||
g_value_set_object(value, emp->currency);
|
||||
g_value_take_object(value, emp->currency);
|
||||
break;
|
||||
case PROP_ACL:
|
||||
g_value_set_string(value, emp->acl);
|
||||
break;
|
||||
case PROP_ADDRESS:
|
||||
g_value_set_object(value, emp->addr);
|
||||
g_value_take_object(value, emp->addr);
|
||||
break;
|
||||
case PROP_WORKDAY:
|
||||
g_value_set_boxed(value, &emp->workday);
|
||||
@ -152,7 +158,7 @@ gnc_employee_get_property (GObject *object,
|
||||
g_value_set_boxed(value, &emp->rate);
|
||||
break;
|
||||
case PROP_CCARD:
|
||||
g_value_set_object(value, emp->ccard_acc);
|
||||
g_value_take_object(value, emp->ccard_acc);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
|
||||
|
@ -121,6 +121,12 @@ gnc_vendor_finalize(GObject* vendorp)
|
||||
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,
|
||||
@ -144,7 +150,7 @@ gnc_vendor_get_property (GObject *object,
|
||||
g_value_set_string(value, vendor->notes);
|
||||
break;
|
||||
case PROP_CURRENCY:
|
||||
g_value_set_object(value, vendor->currency);
|
||||
g_value_take_object(value, vendor->currency);
|
||||
break;
|
||||
case PROP_ACTIVE:
|
||||
g_value_set_boolean(value, vendor->active);
|
||||
@ -153,13 +159,13 @@ gnc_vendor_get_property (GObject *object,
|
||||
g_value_set_boolean(value, vendor->taxtable_override);
|
||||
break;
|
||||
case PROP_BILLTERMS:
|
||||
g_value_set_object(value, vendor->terms);
|
||||
g_value_take_object(value, vendor->terms);
|
||||
break;
|
||||
case PROP_TAXTABLE:
|
||||
g_value_set_object(value, vendor->taxtable);
|
||||
g_value_take_object(value, vendor->taxtable);
|
||||
break;
|
||||
case PROP_ADDRESS:
|
||||
g_value_set_object(value, vendor->addr);
|
||||
g_value_take_object(value, vendor->addr);
|
||||
break;
|
||||
case PROP_TAX_INCLUDED:
|
||||
g_value_set_int(value, vendor->taxincluded);
|
||||
|
@ -277,7 +277,12 @@ gctt_set_property (GObject *object,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* 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
|
||||
gctt_get_property (GObject *object,
|
||||
guint param_id,
|
||||
@ -289,7 +294,7 @@ gctt_get_property (GObject *object,
|
||||
|
||||
switch (param_id) {
|
||||
case PROP_MODEL:
|
||||
g_value_set_object (value, priv->model);
|
||||
g_value_take_object (value, priv->model);
|
||||
break;
|
||||
|
||||
case PROP_ACTIVE:
|
||||
|
@ -605,6 +605,12 @@ gnc_plugin_page_finalize (GObject *object)
|
||||
*
|
||||
* @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 @@ gnc_plugin_page_get_property (GObject *object,
|
||||
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);
|
||||
|
@ -353,6 +353,12 @@ qof_instance_finalize_real (GObject *instp)
|
||||
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 @@ qof_instance_get_property (GObject *object,
|
||||
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);
|
||||
|
@ -465,6 +465,12 @@ gnucash_cursor_set_property (GObject *object,
|
||||
}
|
||||
|
||||
|
||||
/* 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,
|
||||
@ -476,10 +482,10 @@ gnucash_cursor_get_property (GObject *object,
|
||||
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;
|
||||
|
@ -822,6 +822,12 @@ gnucash_grid_set_property (GObject *object,
|
||||
}
|
||||
|
||||
|
||||
/* 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,
|
||||
@ -833,7 +839,7 @@ gnucash_grid_get_property (GObject *object,
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_SHEET:
|
||||
g_value_set_object (value, grid->sheet);
|
||||
g_value_take_object (value, grid->sheet);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -595,6 +595,12 @@ gnc_header_event (GnomeCanvasItem *item, GdkEvent *event)
|
||||
}
|
||||
|
||||
|
||||
/* 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,
|
||||
@ -606,7 +612,7 @@ gnc_header_get_property (GObject *object,
|
||||
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);
|
||||
|
@ -1055,6 +1055,12 @@ disconnect_popup_toggle_signals (GncItemEdit *item_edit)
|
||||
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,
|
||||
@ -1066,10 +1072,10 @@ gnc_item_edit_get_property (GObject *object,
|
||||
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);
|
||||
|
Loading…
Reference in New Issue
Block a user