[gjs/gnome-40: 19/30] gjs-test-tools: Ensure we use thread safe access to the saved object




commit ca54e46d9ccad62c381ce9afed6647726c36e6ea
Author: Marco Trevisan (TreviƱo) <mail 3v1n0 net>
Date:   Wed Apr 28 19:21:54 2021 +0200

    gjs-test-tools: Ensure we use thread safe access to the saved object
    
    Since we use this for testing actions from multiple threads, it's better
    to ensure that we have safe access to the variables.
    
    So use an atomic pointer to keep track of the saved object that allows
    us better control and make ThreadSanitizer happier.
    
    (cherry-picked from commit cbd14c67)

 .../js/libgjstesttools/gjs-test-tools.cpp          | 29 ++++++++++++----------
 .../js/libgjstesttools/gjs-test-tools.h            |  3 +++
 2 files changed, 19 insertions(+), 13 deletions(-)
---
diff --git a/installed-tests/js/libgjstesttools/gjs-test-tools.cpp 
b/installed-tests/js/libgjstesttools/gjs-test-tools.cpp
index d5736ca0..3cd0e2cf 100644
--- a/installed-tests/js/libgjstesttools/gjs-test-tools.cpp
+++ b/installed-tests/js/libgjstesttools/gjs-test-tools.cpp
@@ -9,7 +9,7 @@
 
 #include "gjs/jsapi-util.h"
 
-static GObject* m_tmp_object = NULL;
+static std::atomic<GObject*> m_tmp_object = nullptr;
 static GWeakRef m_tmp_weak;
 static std::unordered_set<GObject*> m_finalized_objects;
 static std::mutex m_finalized_objects_lock;
@@ -24,11 +24,7 @@ struct FinalizedObjectsLocked {
 void gjs_test_tools_init() {}
 
 void gjs_test_tools_reset() {
-    if (!FinalizedObjectsLocked()->count(m_tmp_object))
-        g_clear_object(&m_tmp_object);
-    else
-        m_tmp_object = nullptr;
-
+    gjs_test_tools_clear_saved();
     g_weak_ref_set(&m_tmp_weak, nullptr);
 
     FinalizedObjectsLocked()->clear();
@@ -76,15 +72,22 @@ void gjs_test_tools_delayed_dispose(GObject* object, int interval) {
 }
 
 void gjs_test_tools_save_object(GObject* object) {
-    g_assert(!m_tmp_object);
-    g_set_object(&m_tmp_object, object);
-    monitor_object_finalization(object);
+    g_object_ref(object);
+    gjs_test_tools_save_object_unreffed(object);
 }
 
 void gjs_test_tools_save_object_unreffed(GObject* object) {
-    g_assert(!m_tmp_object);
-    m_tmp_object = object;
-    monitor_object_finalization(object);
+    GObject* expected = nullptr;
+    g_assert(m_tmp_object.compare_exchange_strong(expected, object));
+}
+
+void gjs_test_tools_clear_saved() {
+    if (!FinalizedObjectsLocked()->count(m_tmp_object)) {
+        auto* object = m_tmp_object.exchange(nullptr);
+        g_clear_object(&object);
+    } else {
+        m_tmp_object = nullptr;
+    }
 }
 
 void gjs_test_tools_ref_other_thread(GObject* object) {
@@ -190,7 +193,7 @@ GObject* gjs_test_tools_get_saved() {
     if (FinalizedObjectsLocked()->count(m_tmp_object))
         m_tmp_object = nullptr;
 
-    return static_cast<GObject*>(g_steal_pointer(&m_tmp_object));
+    return m_tmp_object.exchange(nullptr);
 }
 
 /**
diff --git a/installed-tests/js/libgjstesttools/gjs-test-tools.h 
b/installed-tests/js/libgjstesttools/gjs-test-tools.h
index 8bd93d28..89f28b7c 100644
--- a/installed-tests/js/libgjstesttools/gjs-test-tools.h
+++ b/installed-tests/js/libgjstesttools/gjs-test-tools.h
@@ -62,6 +62,9 @@ GObject* gjs_test_tools_get_saved();
 _GJS_TEST_TOOL_EXTERN
 GObject* gjs_test_tools_steal_saved();
 
+_GJS_TEST_TOOL_EXTERN
+void gjs_test_tools_clear_saved();
+
 _GJS_TEST_TOOL_EXTERN
 void gjs_test_tools_save_weak(GObject* object);
 


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