From a68605beca0389bcee9c3861e3cfd6a178630454 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Tue, 26 Jul 2011 16:16:28 +0100 Subject: [PATCH 6/8] add and use _dbus_pending_call_trace_ref --- dbus/dbus-pending-call.c | 47 ++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 41 insertions(+), 6 deletions(-) diff --git a/dbus/dbus-pending-call.c b/dbus/dbus-pending-call.c index df2b2d6..dc30ae9 100644 --- a/dbus/dbus-pending-call.c +++ b/dbus/dbus-pending-call.c @@ -79,6 +79,27 @@ struct DBusPendingCall unsigned int timeout_added : 1; /**< Have added the timeout */ }; +#ifdef DBUS_ENABLE_VERBOSE_MODE +static void +_dbus_pending_call_trace_ref (DBusPendingCall *pending_call, + int old_refcount, + int new_refcount, + const char *why) +{ + static int enabled = -1; + + _dbus_trace_ref ("DBusPendingCall", pending_call, old_refcount, + new_refcount, why, "DBUS_PENDING_CALL_TRACE", &enabled); +} +#else +#define _dbus_pending_call_trace_ref(p, o, n, w) \ + do \ + {\ + (void) (o); \ + (void) (n); \ + } while (0) +#endif + static dbus_int32_t notify_user_data_slot = -1; /** @@ -140,7 +161,9 @@ _dbus_pending_call_new_unlocked (DBusConnection *connection, _dbus_connection_ref_unlocked (pending->connection); _dbus_data_slot_list_init (&pending->slot_list); - + + _dbus_pending_call_trace_ref (pending, 0, 1, "new_unlocked"); + return pending; } @@ -377,7 +400,11 @@ _dbus_pending_call_set_timeout_error_unlocked (DBusPendingCall *pending, DBusPendingCall * _dbus_pending_call_ref_unlocked (DBusPendingCall *pending) { - _dbus_atomic_inc (&pending->refcount); + dbus_int32_t old_refcount; + + old_refcount = _dbus_atomic_inc (&pending->refcount); + _dbus_pending_call_trace_ref (pending, old_refcount, old_refcount + 1, + "ref_unlocked"); return pending; } @@ -440,6 +467,8 @@ _dbus_pending_call_unref_and_unlock (DBusPendingCall *pending) old_refcount = _dbus_atomic_dec (&pending->refcount); _dbus_assert (old_refcount > 0); + _dbus_pending_call_trace_ref (pending, old_refcount, + old_refcount - 1, "unref_and_unlock"); CONNECTION_UNLOCK (pending->connection); @@ -554,9 +583,13 @@ _dbus_pending_call_set_data_unlocked (DBusPendingCall *pending, DBusPendingCall * dbus_pending_call_ref (DBusPendingCall *pending) { + dbus_int32_t old_refcount; + _dbus_return_val_if_fail (pending != NULL, NULL); - _dbus_atomic_inc (&pending->refcount); + old_refcount = _dbus_atomic_inc (&pending->refcount); + _dbus_pending_call_trace_ref (pending, old_refcount, old_refcount + 1, + "ref"); return pending; } @@ -570,13 +603,15 @@ dbus_pending_call_ref (DBusPendingCall *pending) void dbus_pending_call_unref (DBusPendingCall *pending) { - dbus_bool_t last_unref; + dbus_int32_t old_refcount; _dbus_return_if_fail (pending != NULL); - last_unref = (_dbus_atomic_dec (&pending->refcount) == 1); + old_refcount = _dbus_atomic_dec (&pending->refcount); + _dbus_pending_call_trace_ref (pending, old_refcount, old_refcount - 1, + "unref"); - if (last_unref) + if (old_refcount == 1) _dbus_pending_call_last_unref(pending); } -- 1.7.6.3