|
From: <br...@us...> - 2010-04-28 06:22:39
|
Revision: 4126
http://openvrml.svn.sourceforge.net/openvrml/?rev=4126&view=rev
Author: braden
Date: 2010-04-28 06:22:32 +0000 (Wed, 28 Apr 2010)
Log Message:
-----------
Protect openvrml::browser::node_metatype_registry_ with a mutex.
Modified Paths:
--------------
trunk/ChangeLog
trunk/src/libopenvrml/openvrml/browser.cpp
trunk/src/libopenvrml/openvrml/browser.h
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2010-04-28 06:13:49 UTC (rev 4125)
+++ trunk/ChangeLog 2010-04-28 06:22:32 UTC (rev 4126)
@@ -1,5 +1,27 @@
2010-04-28 Braden McDaniel <br...@en...>
+ Protect openvrml::browser::node_metatype_registry_ with a mutex.
+
+ * src/libopenvrml/openvrml/browser.h
+ (openvrml::browser): Added node_metatype_registry_mutex_.
+ * src/libopenvrml/openvrml/browser.cpp
+ (openvrml::browser::~browser()): Lock the
+ node_metatype_registry_mutex_.
+ (openvrml::browser::add_node_metatype(const node_metatype_id &,
+ const boost::shared_ptr<openvrml::node_metatype> &)): Lock the
+ node_metatype_registry_mutex_.
+ (openvrml::browser::node_metatype(const node_metatype_id &)
+ const): Lock the node_metatype_registry_mutex_.
+ (openvrml::browser::set_world(resource_istream &)): Lock the
+ node_metatype_registry_mutex_.
+ (openvrml::browser::replace_world(const
+ std::vector<boost::intrusive_ptr<node> > &)): Lock the
+ node_metatype_registry_mutex_.
+ (openvrml::browser::render()): Lock the
+ node_metatype_registry_mutex_.
+
+2010-04-28 Braden McDaniel <br...@en...>
+
* src/node/vrml97/image_stream_listener.cpp
(openvrml_png_info_callback(png_structp, png_infop)): Added
missing "using" declaration.
Modified: trunk/src/libopenvrml/openvrml/browser.cpp
===================================================================
--- trunk/src/libopenvrml/openvrml/browser.cpp 2010-04-28 06:13:49 UTC (rev 4125)
+++ trunk/src/libopenvrml/openvrml/browser.cpp 2010-04-28 06:22:32 UTC (rev 4126)
@@ -1087,6 +1087,22 @@
/**
* @internal
*
+ * @var boost::shared_mutex openvrml::browser::node_metatype_registry_mutex_
+ *
+ * @brief Mutex to protect @c #node_metatype_registry_.
+ */
+
+/**
+ * @internal
+ *
+ * @var boost::scoped_ptr<openvrml::node_metatype_registry> openvrml::browser::node_metatype_registry_
+ *
+ * @brief The @c browser's @c node_type_registry.
+ */
+
+/**
+ * @internal
+ *
* @var std::auto_ptr<openvrml::null_node_metatype> openvrml::browser::null_node_metatype_
*
* @brief “Null” class object for default nodes (e.g.,
@@ -1481,6 +1497,8 @@
shared_lock<shared_mutex> scene_lock(this->scene_mutex_);
if (this->scene_) { this->scene_->shutdown(now); }
+ shared_lock<shared_mutex>
+ node_metatype_registry_lock(this->node_metatype_registry_mutex_);
this->node_metatype_registry_->impl_->shutdown(now);
assert(this->viewpoint_list_.empty());
assert(this->scoped_lights_.empty());
@@ -1511,6 +1529,11 @@
const boost::shared_ptr<openvrml::node_metatype> & metatype)
OPENVRML_THROW2(std::invalid_argument, std::bad_alloc)
{
+ using boost::shared_lock;
+ using boost::shared_mutex;
+
+ shared_lock<shared_mutex>
+ node_metatype_registry_lock(this->node_metatype_registry_mutex_);
this->node_metatype_registry_->impl_->register_node_metatype(id, metatype);
}
@@ -1526,6 +1549,11 @@
openvrml::browser::node_metatype(const node_metatype_id & id) const
OPENVRML_NOTHROW
{
+ using boost::shared_lock;
+ using boost::shared_mutex;
+
+ shared_lock<shared_mutex>
+ node_metatype_registry_lock(this->node_metatype_registry_mutex_);
return this->node_metatype_registry_->impl_->find(id);
}
@@ -1875,7 +1903,9 @@
using boost::upgrade_to_unique_lock;
using local::uri;
- upgrade_lock<shared_mutex> scene_lock(this->scene_mutex_);
+ upgrade_lock<shared_mutex>
+ scene_lock(this->scene_mutex_),
+ node_metatype_registry_lock(this->node_metatype_registry_mutex_);
//
// Clear out the current scene.
@@ -1891,7 +1921,9 @@
browser_event(*this, browser_event::shutdown)));
{
- upgrade_to_unique_lock<shared_mutex> scene_write_lock(scene_lock);
+ upgrade_to_unique_lock<shared_mutex>
+ scene_write_lock(scene_lock),
+ node_metatype_registry_mutex_(node_metatype_registry_lock);
this->scene_.reset();
assert(this->viewpoint_list_.empty());
@@ -1963,7 +1995,9 @@
{
using boost::shared_lock;
using boost::shared_mutex;
- shared_lock<shared_mutex> lock(this->scene_mutex_);
+ shared_lock<shared_mutex>
+ scene_lock(this->scene_mutex_),
+ node_metatype_registry_lock(this->node_metatype_registry_mutex_);
const double now = browser::current_time();
this->scene_->nodes(nodes);
this->scene_->initialize(now);
@@ -2313,6 +2347,7 @@
shared_lock<shared_mutex>
scene_lock(this->scene_mutex_),
+ node_metatype_registry_lock(this->node_metatype_registry_mutex_),
active_viewpoint_lock_(this->active_viewpoint_mutex_);
if (!this->viewer_) { return; }
Modified: trunk/src/libopenvrml/openvrml/browser.h
===================================================================
--- trunk/src/libopenvrml/openvrml/browser.h 2010-04-28 06:13:49 UTC (rev 4125)
+++ trunk/src/libopenvrml/openvrml/browser.h 2010-04-28 06:22:32 UTC (rev 4126)
@@ -216,6 +216,7 @@
std::vector<boost::intrusive_ptr<node> > & nodes,
std::map<std::string, std::string> & meta);
+ mutable boost::shared_mutex node_metatype_registry_mutex_;
boost::scoped_ptr<node_metatype_registry> node_metatype_registry_;
const boost::scoped_ptr<null_node_metatype> null_node_metatype_;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|