gboolean gdm_settings_direct_get_int (const char *key, int *value) { GdmSettingsEntry *entry; gboolean ret; gboolean res; char *str; g_return_val_if_fail (key != NULL, FALSE); entry = get_entry_for_key (key); g_assert (entry != NULL); assert_signature (entry, "i"); ret = FALSE; res = get_value (key, &str); if (! res) { /* use the default */ str = g_strdup (gdm_settings_entry_get_default_value (entry)); } ret = gdm_settings_parse_value_as_integer (str, value); g_free (str); return ret; }
gboolean gdm_settings_direct_get_string (const char *key, char **value) { GdmSettingsEntry *entry; gboolean ret; gboolean res; char *str; g_return_val_if_fail (key != NULL, FALSE); entry = get_entry_for_key (key); g_assert (entry != NULL); assert_signature (entry, "s"); ret = TRUE; res = get_value (key, &str); if (! res) { /* use the default */ str = g_strdup (gdm_settings_entry_get_default_value (entry)); } if (value != NULL) { *value = g_strdup (str); } g_free (str); return ret; }
// Thread-safe, but if somebody can remove the key while find() is // in progress, then any returned value is not guaranteed to correspond // to that key. This also applies if the key was not already present but // once was. Elements can be found in any order. TValue* find(std::uint64_t key) { auto idxEntry = get_entry_for_key(key); if (idxEntry == nullptr) return nullptr; return idxEntry->value.load(std::memory_order_acquire); }
// Thread-safe, but if somebody else can remove the same key while remove() // is in progress, then any removed value is not guaranteed to correspond // to that key This also applies if the key was not already present but // once was. Elements can be removed in an order. TValue* remove(std::uint64_t key) { auto idxEntry = get_entry_for_key(key); if (idxEntry == nullptr) return nullptr; TValue* val = nullptr; while (!idxEntry->value.compare_exchange_weak(val, nullptr, std::memory_order_acquire, std::memory_order_relaxed)) continue; return val; }