From ef0f6ec93550560992b516ab1ae0ac30c0e2d8e6 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Thu, 14 Jul 2011 17:26:52 +0100 Subject: dbus-memory: use atomic accesses to block count, even for assertions Reviewed-by: Cosimo Alfarano Bug: https://bugs.freedesktop.org/show_bug.cgi?id=38005 --- dbus/dbus-memory.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/dbus/dbus-memory.c b/dbus/dbus-memory.c index a37759c0..ee40e82b 100644 --- a/dbus/dbus-memory.c +++ b/dbus/dbus-memory.c @@ -295,7 +295,7 @@ _dbus_decrement_fail_alloc_counter (void) int _dbus_get_malloc_blocks_outstanding (void) { - return n_blocks_outstanding.value; + return _dbus_atomic_get (&n_blocks_outstanding); } /** @@ -634,10 +634,15 @@ dbus_free (void *memory) check_guards (memory, TRUE); if (memory) { - _dbus_atomic_dec (&n_blocks_outstanding); - - _dbus_assert (n_blocks_outstanding.value >= 0); - +#ifdef DBUS_DISABLE_ASSERT + _dbus_atomic_dec (&n_blocks_outstanding); +#else + dbus_int32_t old_value; + + old_value = _dbus_atomic_dec (&n_blocks_outstanding); + _dbus_assert (old_value >= 1); +#endif + free (((unsigned char*)memory) - GUARD_START_OFFSET); } @@ -648,9 +653,14 @@ dbus_free (void *memory) if (memory) /* we guarantee it's safe to free (NULL) */ { #ifdef DBUS_BUILD_TESTS +#ifdef DBUS_DISABLE_ASSERT _dbus_atomic_dec (&n_blocks_outstanding); - - _dbus_assert (n_blocks_outstanding.value >= 0); +#else + dbus_int32_t old_value; + + old_value = _dbus_atomic_dec (&n_blocks_outstanding); + _dbus_assert (old_value >= 1); +#endif #endif free (memory); -- cgit v1.2.3 From 438595294c544abd669d657bcc828e51f6868a39 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Thu, 14 Jul 2011 17:20:21 +0100 Subject: DBusMessage: always access refcount atomically, even for assertions/initial ref Reviewed-by: Cosimo Alfarano Bug: https://bugs.freedesktop.org/show_bug.cgi?id=38005 --- dbus/dbus-message.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/dbus/dbus-message.c b/dbus/dbus-message.c index a6426ba4..a95ad0fa 100644 --- a/dbus/dbus-message.c +++ b/dbus/dbus-message.c @@ -526,7 +526,8 @@ dbus_message_get_cached (void) _dbus_assert (i < MAX_MESSAGE_CACHE_SIZE); _dbus_assert (message != NULL); - _dbus_assert (message->refcount.value == 0); + _dbus_assert (_dbus_atomic_get (&message->refcount) == 0); + _dbus_assert (message->counters == NULL); _DBUS_UNLOCK (message_cache); @@ -586,8 +587,8 @@ dbus_message_cache_or_finalize (DBusMessage *message) { dbus_bool_t was_cached; int i; - - _dbus_assert (message->refcount.value == 0); + + _dbus_assert (_dbus_atomic_get (&message->refcount) == 0); /* This calls application code and has to be done first thing * without holding the lock @@ -649,8 +650,8 @@ dbus_message_cache_or_finalize (DBusMessage *message) #endif out: - _dbus_assert (message->refcount.value == 0); - + _dbus_assert (_dbus_atomic_get (&message->refcount) == 0); + _DBUS_UNLOCK (message_cache); if (!was_cached) @@ -1039,7 +1040,7 @@ dbus_message_get_reply_serial (DBusMessage *message) static void dbus_message_finalize (DBusMessage *message) { - _dbus_assert (message->refcount.value == 0); + _dbus_assert (_dbus_atomic_get (&message->refcount) == 0); /* This calls application callbacks! */ _dbus_data_slot_list_free (&message->slot_list); @@ -1056,8 +1057,8 @@ dbus_message_finalize (DBusMessage *message) dbus_free(message->unix_fds); #endif - _dbus_assert (message->refcount.value == 0); - + _dbus_assert (_dbus_atomic_get (&message->refcount) == 0); + dbus_free (message); } @@ -1076,7 +1077,7 @@ dbus_message_new_empty_header (void) else { from_cache = FALSE; - message = dbus_new (DBusMessage, 1); + message = dbus_new0 (DBusMessage, 1); if (message == NULL) return NULL; #ifndef DBUS_DISABLE_CHECKS @@ -1088,8 +1089,9 @@ dbus_message_new_empty_header (void) message->n_unix_fds_allocated = 0; #endif } - - message->refcount.value = 1; + + _dbus_atomic_inc (&message->refcount); + message->byte_order = DBUS_COMPILER_BYTE_ORDER; message->locked = FALSE; #ifndef DBUS_DISABLE_CHECKS @@ -1448,7 +1450,7 @@ dbus_message_copy (const DBusMessage *message) if (retval == NULL) return NULL; - retval->refcount.value = 1; + _dbus_atomic_inc (&retval->refcount); retval->byte_order = message->byte_order; retval->locked = FALSE; #ifndef DBUS_DISABLE_CHECKS -- cgit v1.2.3 From 104dc9383cd17d8202430d85e49ece66be7960a5 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Tue, 26 Jul 2011 17:59:23 +0100 Subject: NEWS --- NEWS | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index ebfb6487..42ea78b7 100644 --- a/NEWS +++ b/NEWS @@ -7,10 +7,9 @@ Changes: or dbus_connection_try_register_fallback fails, not ...ADDRESS_IN_USE (fd.o #38874, Jiří Klimeš) -• Consistently use atomic operations on the refcounts of DBusPendingCall, - DBusServer, DBusMessageFilter and DBusObjectTree, as was done for - DBusConnection in 1.4.12, and make the use of atomic operations - more thorough for DBusConnection (fd.o #38005, Simon McVittie) +• Consistently use atomic operations on everything that is ever manipulated + via atomic ops, as was done for changes to DBusConnection's refcount in + 1.4.12 (fd.o #38005, Simon McVittie) • Fix a file descriptor leak when connecting to a TCP socket (fd.o #37258, Simon McVittie) -- cgit v1.2.3