[glib: 2/4] GWin32RegistryKey: ensure reqeueing works correctly




commit 6885a29428dd6f522a9486d0cbd8225f4198696e
Author: Руслан Ижбулатов <lrn1986 gmail com>
Date:   Sat Jul 31 10:57:44 2021 +0000

    GWin32RegistryKey: ensure reqeueing works correctly
    
    If a key watch is renewed from the key watch callback, it results
    in the callback being NULL, since we clear it after we call it.
    
    Rearrange the function to make sure that the changes done by the
    callback function are preserved properly.

 gio/gwin32registrykey.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)
---
diff --git a/gio/gwin32registrykey.c b/gio/gwin32registrykey.c
index d1ac09041..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);
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]