summaryrefslogtreecommitdiff
path: root/gio/gnextstepsettingsbackend.c
diff options
context:
space:
mode:
authorWilliam Hua <william@attente.ca>2012-01-01 21:38:05 -0500
committerWilliam Hua <william@attente.ca>2012-01-01 21:59:39 -0500
commitedd2aff575888dc6cd6570681c719bc18fe91bb2 (patch)
treedda7888ef6161fdc7ef0ff8de5c94d72971c3381 /gio/gnextstepsettingsbackend.c
parent9c1008384414a257d1f0f354d5ea897df0e24e89 (diff)
downloadglib-edd2aff575888dc6cd6570681c719bc18fe91bb2.tar.gz
thread-safe nextstep gsettings backend
simplified key reset logic
Diffstat (limited to 'gio/gnextstepsettingsbackend.c')
-rw-r--r--gio/gnextstepsettingsbackend.c49
1 files changed, 32 insertions, 17 deletions
diff --git a/gio/gnextstepsettingsbackend.c b/gio/gnextstepsettingsbackend.c
index ac4a10571..92b2987c8 100644
--- a/gio/gnextstepsettingsbackend.c
+++ b/gio/gnextstepsettingsbackend.c
@@ -46,6 +46,7 @@ struct _GNextstepSettingsBackend
/*< private >*/
NSUserDefaults *user_defaults;
+ GMutex mutex;
};
@@ -129,6 +130,8 @@ g_nextstep_settings_backend_init (GNextstepSettingsBackend *self)
self->user_defaults = [[NSUserDefaults standardUserDefaults] retain];
+ g_mutex_init (&self->mutex);
+
[pool drain];
}
@@ -137,11 +140,14 @@ g_nextstep_settings_backend_init (GNextstepSettingsBackend *self)
static void
g_nextstep_settings_backend_finalize (GObject *self)
{
+ GNextstepSettingsBackend *backend = G_NEXTSTEP_SETTINGS_BACKEND (self);
NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];
- [G_NEXTSTEP_SETTINGS_BACKEND (self)->user_defaults release];
+ g_mutex_clear (&backend->mutex);
+
+ [backend->user_defaults release];
[pool drain];
@@ -156,6 +162,7 @@ g_nextstep_settings_backend_read (GSettingsBackend *backend,
const GVariantType *expected_type,
gboolean default_value)
{
+ GNextstepSettingsBackend *self = G_NEXTSTEP_SETTINGS_BACKEND (backend);
NSAutoreleasePool *pool;
NSString *name;
id value;
@@ -166,7 +173,11 @@ g_nextstep_settings_backend_read (GSettingsBackend *backend,
pool = [[NSAutoreleasePool alloc] init];
name = [NSString stringWithUTF8String:key];
- value = [G_NEXTSTEP_SETTINGS_BACKEND (backend)->user_defaults objectForKey:name];
+
+ g_mutex_lock (&self->mutex);
+ value = [self->user_defaults objectForKey:name];
+ g_mutex_unlock (&self->mutex);
+
variant = g_nextstep_settings_backend_get_g_variant (value, expected_type);
[pool drain];
@@ -191,11 +202,15 @@ g_nextstep_settings_backend_write (GSettingsBackend *backend,
GVariant *value,
gpointer origin_tag)
{
+ GNextstepSettingsBackend *self = G_NEXTSTEP_SETTINGS_BACKEND (backend);
NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];
- g_nextstep_settings_backend_write_pair ((gpointer) key, value, backend);
+ g_mutex_lock (&self->mutex);
+ g_nextstep_settings_backend_write_pair ((gpointer) key, value, self);
+ g_mutex_unlock (&self->mutex);
+
g_settings_backend_changed (backend, key, origin_tag);
[pool drain];
@@ -210,11 +225,14 @@ g_nextstep_settings_backend_write_tree (GSettingsBackend *backend,
GTree *tree,
gpointer origin_tag)
{
+ GNextstepSettingsBackend *self = G_NEXTSTEP_SETTINGS_BACKEND (backend);
NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];
- g_tree_foreach (tree, g_nextstep_settings_backend_write_pair, backend);
+ g_mutex_lock (&self->mutex);
+ g_tree_foreach (tree, g_nextstep_settings_backend_write_pair, self);
+ g_mutex_unlock (&self->mutex);
g_settings_backend_changed_tree (backend, tree, origin_tag);
[pool drain];
@@ -229,23 +247,18 @@ g_nextstep_settings_backend_reset (GSettingsBackend *backend,
const gchar *key,
gpointer origin_tag)
{
+ GNextstepSettingsBackend *self = G_NEXTSTEP_SETTINGS_BACKEND (backend);
NSAutoreleasePool *pool;
- NSUserDefaults *user_defaults;
NSString *name;
- id value;
- id default_value;
pool = [[NSAutoreleasePool alloc] init];
- user_defaults = G_NEXTSTEP_SETTINGS_BACKEND (backend)->user_defaults;
name = [NSString stringWithUTF8String:key];
- value = [user_defaults objectForKey:name];
- [user_defaults removeObjectForKey:name];
+ g_mutex_lock (&self->mutex);
+ [self->user_defaults removeObjectForKey:name];
+ g_mutex_unlock (&self->mutex);
- default_value = [user_defaults objectForKey:name];
-
- if (default_value != value && ![default_value isEqual:value])
- g_settings_backend_changed (backend, key, origin_tag);
+ g_settings_backend_changed (backend, key, origin_tag);
[pool drain];
}
@@ -271,11 +284,14 @@ g_nextstep_settings_backend_unsubscribe (GSettingsBackend *backend,
static void
g_nextstep_settings_backend_sync (GSettingsBackend *backend)
{
+ GNextstepSettingsBackend *self = G_NEXTSTEP_SETTINGS_BACKEND (backend);
NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];
- [G_NEXTSTEP_SETTINGS_BACKEND (backend)->user_defaults synchronize];
+ g_mutex_lock (&self->mutex);
+ [self->user_defaults synchronize];
+ g_mutex_unlock (&self->mutex);
[pool drain];
}
@@ -296,11 +312,10 @@ g_nextstep_settings_backend_write_pair (gpointer name,
gpointer value,
gpointer data)
{
- GNextstepSettingsBackend *backend;
+ GNextstepSettingsBackend *backend = G_NEXTSTEP_SETTINGS_BACKEND (data);
NSString *key;
id object;
- backend = G_NEXTSTEP_SETTINGS_BACKEND (data);
key = [NSString stringWithUTF8String:name];
object = g_nextstep_settings_backend_get_ns_object (value);