summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Withnall <philip@tecnocode.co.uk>2021-08-02 10:51:28 +0000
committerPhilip Withnall <philip@tecnocode.co.uk>2021-08-02 10:51:28 +0000
commitce5a2cfed5035e8243a3fd0bfd32faa6bff1e53f (patch)
tree2c2ad6bd7e9cc3382541cf3de4caea434a0e2b9f
parent02742ef957b532789c003eef80ec7f51c370e3d5 (diff)
parent4e9e7bfd34f33c66a4d25a082f91e9e2a3e231a8 (diff)
downloadglib-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.c5
-rw-r--r--gio/gwin32registrykey.c15
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);