[glibmm] ObjectBase: Change extra_object_base_data_mutex to a std::mutex.
- From: Murray Cumming <murrayc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glibmm] ObjectBase: Change extra_object_base_data_mutex to a std::mutex.
- Date: Thu, 26 Nov 2015 10:07:33 +0000 (UTC)
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]