From 3edda737978a079256a39437f5dea8a319e9fe65 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 2 Oct 2006 11:47:55 +0000 Subject: [PATCH] Added SERIALIZER to ReaderWriterDAE to make sure initialization is thread safe. --- src/osgPlugins/dae/ReaderWriterDAE.cpp | 34 +++++++++++++++++--------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/osgPlugins/dae/ReaderWriterDAE.cpp b/src/osgPlugins/dae/ReaderWriterDAE.cpp index d98736372..b85b1775d 100644 --- a/src/osgPlugins/dae/ReaderWriterDAE.cpp +++ b/src/osgPlugins/dae/ReaderWriterDAE.cpp @@ -17,11 +17,16 @@ #include #include +#include +#include + #include "daeReader.h" #include "daeWriter.h" #define EXTENSION_NAME "dae" +#define SERIALIZER() OpenThreads::ScopedLock lock(_serializerMutex) + /////////////////////////////////////////////////////////////////////////// // OSG reader/writer plugin for the COLLADA 1.4.x ".dae" format. // See http://collada.org/ and http://khronos.org/collada/ @@ -29,16 +34,16 @@ class ReaderWriterDAE : public osgDB::ReaderWriter { public: - ReaderWriterDAE() : dae_(NULL) + ReaderWriterDAE() : _dae(NULL) { } ~ReaderWriterDAE() { - if(dae_ != NULL){ - delete dae_; + if(_dae != NULL){ + delete _dae; DAE::cleanup(); - dae_ = NULL; + _dae = NULL; } } @@ -55,8 +60,9 @@ public: private: - DAE *dae_; - + mutable DAE *_dae; + mutable osgDB::ReentrantMutex _serializerMutex; + }; /////////////////////////////////////////////////////////////////////////// @@ -65,6 +71,8 @@ osgDB::ReaderWriter::ReadResult ReaderWriterDAE::readNode(const std::string& fname, const osgDB::ReaderWriter::Options* options) const { + SERIALIZER(); + std::string ext( osgDB::getLowerCaseFileExtension(fname) ); if( ! acceptsExtension(ext) ) return ReadResult::FILE_NOT_HANDLED; @@ -73,10 +81,10 @@ ReaderWriterDAE::readNode(const std::string& fname, osg::notify(osg::INFO) << "ReaderWriterDAE( \"" << fileName << "\" )" << std::endl; - if (dae_ == NULL) - const_cast(this)->dae_ = new DAE(); + if (_dae == NULL) + _dae = new DAE(); - osgdae::daeReader daeReader(dae_); + osgdae::daeReader daeReader(_dae); std::string fileURI( osgDB::convertFileNameToUnixStyle(fileName) ); if ( ! daeReader.convert( fileURI ) ) { @@ -94,6 +102,8 @@ osgDB::ReaderWriter::WriteResult ReaderWriterDAE::writeNode( const osg::Node& node, const std::string& fname, const osgDB::ReaderWriter::Options* options ) const { + SERIALIZER(); + std::string ext( osgDB::getLowerCaseFileExtension(fname) ); if( ! acceptsExtension(ext) ) return WriteResult::FILE_NOT_HANDLED; @@ -119,10 +129,10 @@ ReaderWriterDAE::writeNode( const osg::Node& node, } } - if (dae_ == NULL) - const_cast(this)->dae_ = new DAE(); + if (_dae == NULL) + _dae = new DAE(); - osgdae::daeWriter daeWriter(dae_, fname, usePolygon ); + osgdae::daeWriter daeWriter(_dae, fname, usePolygon ); daeWriter.setRootNode( node ); const_cast(&node)->accept( daeWriter );