diff options
author | Havoc Pennington <hp@redhat.com> | 2003-03-24 03:16:58 +0000 |
---|---|---|
committer | Havoc Pennington <hp@redhat.com> | 2003-03-24 03:16:58 +0000 |
commit | c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9 (patch) | |
tree | 6010b0b9a2be255b3ff3ac9f62e4c04ce57aef83 /dbus/dbus-sysdeps.c | |
parent | a26607ab68bf0878f23d2dbddec781b4b760d034 (diff) |
2003-03-23 Havoc Pennington <hp@pobox.com>
* dbus/dbus-threads.c (dbus_mutex_new, dbus_condvar_new): with
DBUS_BUILD_TESTS, actually alloc/free a block of memory for
the mutex, so we can check for proper memory management
and OOM handling.
* dbus/dbus-dataslot.c: remove the mutex from
DBusDataSlotAllocator and lock it manually when using it,
to simplify fitting it into the global slots framework.
* dbus/dbus-threads.c (init_static_locks): rework how we're
handling global locks so they are easily shut down.
* bus/policy.c (bus_policy_append_rule): fix
* bus/test-main.c (main): check for memleaks
* dbus/dbus-test.c (dbus_internal_do_not_use_run_tests): make
test suite check for memleaks
* dbus/dbus-memory.c: add support in test mode for tracking
number of outstanding blocks
Diffstat (limited to 'dbus/dbus-sysdeps.c')
-rw-r--r-- | dbus/dbus-sysdeps.c | 100 |
1 files changed, 49 insertions, 51 deletions
diff --git a/dbus/dbus-sysdeps.c b/dbus/dbus-sysdeps.c index 200fbddd..948b0836 100644 --- a/dbus/dbus-sysdeps.c +++ b/dbus/dbus-sysdeps.c @@ -1232,17 +1232,22 @@ _dbus_credentials_from_user_id (unsigned long user_id, return get_user_info (NULL, user_id, credentials, NULL, NULL); } -static DBusMutex *user_info_lock = NULL; -/** - * Initializes the global mutex for the process's user information. - * - * @returns the mutex - */ -DBusMutex * -_dbus_user_info_init_lock (void) +_DBUS_DEFINE_GLOBAL_LOCK (user_info); + +typedef struct { - user_info_lock = dbus_mutex_new (); - return user_info_lock; + DBusString name; + DBusString dir; + DBusCredentials creds; +} UserInfo; + +static void +shutdown_user_info (void *data) +{ + UserInfo *u = data; + + _dbus_string_free (&u->name); + _dbus_string_free (&u->dir); } /** @@ -1258,53 +1263,58 @@ _dbus_user_info_from_current_process (const DBusString **username, const DBusString **homedir, const DBusCredentials **credentials) { - static DBusString name; - static DBusString dir; - static DBusCredentials creds; - static dbus_bool_t initialized = FALSE; + static UserInfo u; + static int initialized_generation = 0; - if (!dbus_mutex_lock (user_info_lock)) + if (!_DBUS_LOCK (user_info)) return FALSE; - if (!initialized) + if (initialized_generation != _dbus_current_generation) { - if (!_dbus_string_init (&name, _DBUS_INT_MAX)) + if (!_dbus_string_init (&u.name, _DBUS_INT_MAX)) { - dbus_mutex_unlock (user_info_lock); + _DBUS_UNLOCK (user_info); return FALSE; } - if (!_dbus_string_init (&dir, _DBUS_INT_MAX)) + if (!_dbus_string_init (&u.dir, _DBUS_INT_MAX)) { - _dbus_string_free (&name); - dbus_mutex_unlock (user_info_lock); + _dbus_string_free (&u.name); + _DBUS_UNLOCK (user_info); return FALSE; } - creds.uid = -1; - creds.gid = -1; - creds.pid = -1; + u.creds.uid = -1; + u.creds.gid = -1; + u.creds.pid = -1; if (!get_user_info (NULL, getuid (), - &creds, &dir, &name)) + &u.creds, &u.dir, &u.name)) + goto fail_init; + + if (!_dbus_register_shutdown_func (shutdown_user_info, + &u)) + goto fail_init; + + initialized_generation = _dbus_current_generation; + fail_init: + if (initialized_generation != _dbus_current_generation) { - _dbus_string_free (&name); - _dbus_string_free (&dir); - dbus_mutex_unlock (user_info_lock); + _dbus_string_free (&u.name); + _dbus_string_free (&u.dir); + _DBUS_UNLOCK (user_info); return FALSE; } - - initialized = TRUE; } if (username) - *username = &name; + *username = &u.name; if (homedir) - *homedir = &dir; + *homedir = &u.dir; if (credentials) - *credentials = &creds; + *credentials = &u.creds; - dbus_mutex_unlock (user_info_lock); + _DBUS_UNLOCK (user_info); return TRUE; } @@ -1594,19 +1604,7 @@ _dbus_string_append_our_uid (DBusString *str) } -static DBusMutex *atomic_lock = NULL; -/** - * Initializes the global mutex for the fallback implementation - * of atomic integers. - * - * @returns the mutex - */ -DBusMutex * -_dbus_atomic_init_lock (void) -{ - atomic_lock = dbus_mutex_new (); - return atomic_lock; -} +_DBUS_DEFINE_GLOBAL_LOCK (atomic); /** * Atomically increments an integer @@ -1621,10 +1619,10 @@ _dbus_atomic_inc (dbus_atomic_t *atomic) { dbus_atomic_t res; - dbus_mutex_lock (atomic_lock); + _DBUS_LOCK (atomic); *atomic += 1; res = *atomic; - dbus_mutex_unlock (atomic_lock); + _DBUS_UNLOCK (atomic); return res; } @@ -1641,10 +1639,10 @@ _dbus_atomic_dec (dbus_atomic_t *atomic) { dbus_atomic_t res; - dbus_mutex_lock (atomic_lock); + _DBUS_LOCK (atomic); *atomic -= 1; res = *atomic; - dbus_mutex_unlock (atomic_lock); + _DBUS_UNLOCK (atomic); return res; } |