diff options
author | Philip Withnall <philip@tecnocode.co.uk> | 2021-08-02 10:51:28 +0000 |
---|---|---|
committer | Philip Withnall <philip@tecnocode.co.uk> | 2021-08-02 10:51:28 +0000 |
commit | ce5a2cfed5035e8243a3fd0bfd32faa6bff1e53f (patch) | |
tree | 2c2ad6bd7e9cc3382541cf3de4caea434a0e2b9f | |
parent | 02742ef957b532789c003eef80ec7f51c370e3d5 (diff) | |
parent | 4e9e7bfd34f33c66a4d25a082f91e9e2a3e231a8 (diff) | |
download | glib-ce5a2cfed5035e8243a3fd0bfd32faa6bff1e53f.tar.gz |
Merge branch 'regwatch-appinfo-fixes' into 'main'
GWin32RegistryKey / GWin32AppInfo registry watch fixes
See merge request GNOME/glib!2205
-rw-r--r-- | gio/gwin32appinfo.c | 5 | ||||
-rw-r--r-- | gio/gwin32registrykey.c | 15 |
2 files changed, 12 insertions, 8 deletions
diff --git a/gio/gwin32appinfo.c b/gio/gwin32appinfo.c index 5403225e2..4074f402c 100644 --- a/gio/gwin32appinfo.c +++ b/gio/gwin32appinfo.c @@ -3828,6 +3828,9 @@ update_registry_data (void) return; } +static void +watch_keys (void); + /* This function is called when any of our registry watchers detect * changes in the registry. */ @@ -3835,6 +3838,7 @@ static void keys_updated (GWin32RegistryKey *key, gpointer user_data) { + watch_keys (); /* Indicate the tree as not up-to-date, push a new job for the AppInfo thread */ g_atomic_int_inc (&gio_win32_appinfo_update_counter); /* We don't use the data pointer, but it must be non-NULL */ @@ -4029,7 +4033,6 @@ gio_win32_appinfo_init (gboolean do_wait) g_mutex_lock (&gio_win32_appinfo_mutex); while (g_atomic_int_get (&gio_win32_appinfo_update_counter) > 0) g_cond_wait (&gio_win32_appinfo_cond, &gio_win32_appinfo_mutex); - watch_keys (); g_mutex_unlock (&gio_win32_appinfo_mutex); } } diff --git a/gio/gwin32registrykey.c b/gio/gwin32registrykey.c index 398d8f45b..5e2b006dd 100644 --- a/gio/gwin32registrykey.c +++ b/gio/gwin32registrykey.c @@ -2425,17 +2425,20 @@ key_changed (PVOID closure, ULONG reserved) { GWin32RegistryKey *key = G_WIN32_REGISTRY_KEY (closure); + gpointer user_data; + GWin32RegistryKeyWatchCallbackFunc callback; + + callback = g_steal_pointer (&key->priv->callback); + user_data = g_steal_pointer (&key->priv->user_data); g_free (status_block); g_atomic_int_set (&key->priv->change_indicator, G_WIN32_KEY_CHANGED); g_atomic_int_set (&key->priv->watch_indicator, G_WIN32_KEY_UNWATCHED); key->priv->update_flags = G_WIN32_REGISTRY_UPDATED_NOTHING; - if (key->priv->callback) - key->priv->callback (key, key->priv->user_data); + if (callback) + callback (key, user_data); - key->priv->callback = NULL; - key->priv->user_data = NULL; g_object_unref (key); } @@ -2550,9 +2553,7 @@ g_win32_registry_key_watch (GWin32RegistryKey *key, 0, TRUE); - g_assert (status != STATUS_SUCCESS); - - if (status == STATUS_PENDING) + if (status == STATUS_PENDING || status == STATUS_SUCCESS) return TRUE; g_atomic_int_set (&key->priv->change_indicator, G_WIN32_KEY_UNKNOWN); |