diff options
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; } |