[glibmm] ObjectBase: Change extra_object_base_data_mutex to a std::mutex.



commit c12604569c65ed543822ccfc337d014b45c27345
Author: Murray Cumming <murrayc murrayc com>
Date:   Thu Nov 26 11:05:43 2015 +0100

    ObjectBase: Change extra_object_base_data_mutex to a std::mutex.
    
    Instead of a (now deprecated) Glib::Threads::Mutex*.
    As discussed here:
    https://bugzilla.gnome.org/show_bug.cgi?id=757674#c12

 glib/glibmm/interface.cc  |    2 +-
 glib/glibmm/object.cc     |   26 ++++++++++++++------------
 glib/glibmm/objectbase.cc |    9 +++++----
 glib/glibmm/objectbase.h  |   10 ++--------
 4 files changed, 22 insertions(+), 25 deletions(-)
---
diff --git a/glib/glibmm/interface.cc b/glib/glibmm/interface.cc
index 5d178cb..52e9bed 100644
--- a/glib/glibmm/interface.cc
+++ b/glib/glibmm/interface.cc
@@ -99,7 +99,7 @@ Interface::Interface(const Interface_Class& interface_class)
     {
       // The GObject is not instantiated yet. Add to the custom_interface_classes
       // and add the interface in the Glib::Object constructor.
-      Threads::Mutex::Lock lock(*extra_object_base_data_mutex);
+      std::lock_guard<std::mutex> lock(extra_object_base_data_mutex);
       extra_object_base_data[this].custom_interface_classes.push_back(&interface_class);
     }
   }
diff --git a/glib/glibmm/object.cc b/glib/glibmm/object.cc
index 3736c5d..d0cf9e1 100644
--- a/glib/glibmm/object.cc
+++ b/glib/glibmm/object.cc
@@ -200,14 +200,15 @@ Object::Object()
   {
     Class::interface_class_vector_type custom_interface_classes;
 
-    Threads::Mutex::Lock lock(*extra_object_base_data_mutex);
-    const extra_object_base_data_type::iterator iter = extra_object_base_data.find(this);
-    if (iter != extra_object_base_data.end())
     {
-      custom_interface_classes = iter->second.custom_interface_classes;
-      extra_object_base_data.erase(iter);
+      std::lock_guard<std::mutex> lock(extra_object_base_data_mutex);
+      const extra_object_base_data_type::iterator iter = extra_object_base_data.find(this);
+      if (iter != extra_object_base_data.end())
+      {
+        custom_interface_classes = iter->second.custom_interface_classes;
+        extra_object_base_data.erase(iter);
+      }
     }
-    lock.release();
 
     object_class_.init();
     // This creates a type that is derived (indirectly) from GObject.
@@ -233,14 +234,15 @@ Object::Object(const Glib::ConstructParams& construct_params)
   {
     Class::interface_class_vector_type custom_interface_classes;
 
-    Threads::Mutex::Lock lock(*extra_object_base_data_mutex);
-    const extra_object_base_data_type::iterator iter = extra_object_base_data.find(this);
-    if (iter != extra_object_base_data.end())
     {
-      custom_interface_classes = iter->second.custom_interface_classes;
-      extra_object_base_data.erase(iter);
+      std::lock_guard<std::mutex> lock(extra_object_base_data_mutex);
+      const extra_object_base_data_type::iterator iter = extra_object_base_data.find(this);
+      if (iter != extra_object_base_data.end())
+      {
+        custom_interface_classes = iter->second.custom_interface_classes;
+        extra_object_base_data.erase(iter);
+      }
     }
-    lock.release();
 
     object_type = construct_params.glibmm_class.clone_custom_type(
       custom_type_name_, custom_interface_classes);
diff --git a/glib/glibmm/objectbase.cc b/glib/glibmm/objectbase.cc
index 84f7f3d..9c59ed9 100644
--- a/glib/glibmm/objectbase.cc
+++ b/glib/glibmm/objectbase.cc
@@ -43,7 +43,7 @@ namespace Glib
 
 // static data members
 ObjectBase::extra_object_base_data_type ObjectBase::extra_object_base_data;
-Threads::Mutex* ObjectBase::extra_object_base_data_mutex = new Threads::Mutex();
+std::mutex ObjectBase::extra_object_base_data_mutex;
 
 ObjectBase::ObjectBase()
 :
@@ -158,9 +158,10 @@ ObjectBase::~ObjectBase() noexcept
   // Just a precaution. Unless a derived class's ctor has thrown an exception,
   // 'this' should have been erased from extra_object_base_data by
   // Glib::Object's constructor.
-  Threads::Mutex::Lock lock(*extra_object_base_data_mutex);
-  extra_object_base_data.erase(this);
-  lock.release();
+  {
+    std::lock_guard<std::mutex> lock(extra_object_base_data_mutex);
+    extra_object_base_data.erase(this);
+  }
 
   if(GObject *const gobject = gobject_)
   {
diff --git a/glib/glibmm/objectbase.h b/glib/glibmm/objectbase.h
index 43438e0..7f13fe3 100644
--- a/glib/glibmm/objectbase.h
+++ b/glib/glibmm/objectbase.h
@@ -30,6 +30,7 @@
 #include <typeinfo>
 #include <map> // Needed until the next ABI break.
 #include <memory> // Not used by ObjectBase any more, but user code may rely on it being here.
+#include <mutex>
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 extern "C" { typedef struct _GObject GObject; }
@@ -41,10 +42,6 @@ namespace Glib
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 class GSigConnectionNode;
 class Interface_Class;
-namespace Threads
-{
-class Mutex;
-}
 #endif
 
 //This inherits virtually from sigc::trackable so that people can multiply inherit glibmm classes from other 
sigc::trackable-derived classes.
@@ -221,10 +218,7 @@ typedef std::map<const ObjectBase*, ExtraObjectBaseData> extra_object_base_data_
 static extra_object_base_data_type extra_object_base_data;
 // ObjectBase instances may be used in different threads.
 // Accesses to extra_object_base_data must be thread-safe.
-// Threads::Mutex*, because we don't want to include glibmm/threads.h in objectbase.h.
-// threads.h must be the first included file that includes glib.h. That could cause
-// problems in files that directly or indirectly include objectbase.h.
-static Threads::Mutex* extra_object_base_data_mutex;
+static std::mutex extra_object_base_data_mutex;
 
 public: //  is_derived_() must be public, so that overridden vfuncs and signal handlers can call it via 
ObjectBase.
 


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