From ffcd95b004772ffe23b9ce8d9dc8aa541a1bbaae Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 23 Nov 2004 12:57:00 +0000 Subject: [PATCH] Tripped out experiemental threadSafe_ methods in ReaderWriter --- examples/osgarchive/osgarchive.cpp | 4 +-- include/osgDB/Archive | 2 -- include/osgDB/ReaderWriter | 41 ------------------------ src/osgDB/Registry.cpp | 28 ++++++++-------- src/osgPlugins/net/ReaderWriterNET.cpp | 10 +++--- src/osgPlugins/osga/OSGA_Archive.cpp | 36 +++++++++++++++------ src/osgPlugins/osga/OSGA_Archive.h | 7 ++++ src/osgPlugins/osga/ReaderWriterOSGA.cpp | 4 +-- src/osgTerrain/DataSet.cpp | 4 +-- 9 files changed, 58 insertions(+), 78 deletions(-) diff --git a/examples/osgarchive/osgarchive.cpp b/examples/osgarchive/osgarchive.cpp index ebd588b9f..ab4d6ef73 100644 --- a/examples/osgarchive/osgarchive.cpp +++ b/examples/osgarchive/osgarchive.cpp @@ -134,7 +134,7 @@ int main( int argc, char **argv ) if (obj.valid()) { std::cout<<" write to archive "<<*itr<threadSafe_writeObject(*obj, *itr); + archive->writeObject(*obj, *itr); } } } @@ -150,7 +150,7 @@ int main( int argc, char **argv ) ++itr) { osg::Timer_t start = osg::Timer::instance()->tick(); - osgDB::ReaderWriter::ReadResult result = archive->threadSafe_readObject(*itr); + osgDB::ReaderWriter::ReadResult result = archive->readObject(*itr); osg::ref_ptr obj = result.getObject(); std::cout<<"readObejct time = "<delta_m(start,osg::Timer::instance()->tick())< #include -#include - #include -#include #include @@ -217,38 +214,6 @@ class OSGDB_EXPORT ReaderWriter : public osg::Object WRITE, CREATE }; - - #define SERIALIZER() OpenThreads::ScopedLock lock(_serializerMutex) - - - - /** open an archive for reading, writing or or to create an empty archive for writing to.*/ - virtual ReadResult threadSafe_openArchive(const std::string& fileName,ArchiveStatus status, unsigned int indexBlockSize=4096, const Options* options=NULL) { SERIALIZER(); return openArchive(fileName,status, indexBlockSize, options); } - - /** open an archive for reading.*/ - virtual ReadResult threadSafe_openArchive(std::istream& fin,const Options* options=NULL) { SERIALIZER(); return openArchive(fin, options); } - - virtual ReadResult threadSafe_readObject(const std::string& fileName,const Options* options=NULL) { SERIALIZER(); return readObject(fileName,options); } - virtual ReadResult threadSafe_readImage(const std::string& fileName,const Options* options=NULL) { SERIALIZER(); return readImage(fileName,options); } - virtual ReadResult threadSafe_readHeightField(const std::string& fileName,const Options* options=NULL) { SERIALIZER(); return readHeightField(fileName,options); } - virtual ReadResult threadSafe_readNode(const std::string& fileName,const Options* options=NULL) { SERIALIZER(); return readNode(fileName,options); } - - virtual WriteResult threadSafe_writeObject(const osg::Object& obj,const std::string& fileName,const Options* options=NULL) { SERIALIZER(); return writeObject(obj, fileName,options); } - virtual WriteResult threadSafe_writeImage(const osg::Image& image,const std::string& fileName,const Options* options=NULL) { SERIALIZER(); return writeImage(image, fileName,options); } - virtual WriteResult threadSafe_writeHeightField(const osg::HeightField& heightField,const std::string& fileName,const Options* options=NULL) { SERIALIZER(); return writeHeightField(heightField, fileName,options); } - virtual WriteResult threadSafe_writeNode(const osg::Node& node,const std::string& fileName,const Options* options=NULL) { SERIALIZER(); return writeNode(node, fileName,options); } - - virtual ReadResult threadSafe_readObject(std::istream& fin,const Options* options=NULL) { SERIALIZER(); return readObject(fin,options); } - virtual ReadResult threadSafe_readImage(std::istream& fin,const Options* options=NULL) { SERIALIZER(); return readImage(fin,options); } - virtual ReadResult threadSafe_readHeightField(std::istream& fin,const Options* options=NULL) { SERIALIZER(); return readHeightField(fin,options); } - virtual ReadResult threadSafe_readNode(std::istream& fin,const Options* options=NULL) { SERIALIZER(); return readNode(fin,options); } - - virtual WriteResult threadSafe_writeObject(const osg::Object& obj,std::ostream& fout,const Options* options=NULL) { SERIALIZER(); return writeObject(obj, fout, options); } - virtual WriteResult threadSafe_writeImage(const osg::Image& image,std::ostream& fout,const Options* options=NULL) { SERIALIZER(); return writeImage(image, fout, options); } - virtual WriteResult threadSafe_writeHeightField(const osg::HeightField& heightField,std::ostream& fout,const Options* options=NULL) { SERIALIZER(); return writeHeightField(heightField, fout, options); } - virtual WriteResult threadSafe_writeNode(const osg::Node& node,std::ostream& fout,const Options* options=NULL) { SERIALIZER(); return writeNode(node, fout, options); } - - protected: /** open an archive for reading, writing or or to create an empty archive for writing to.*/ virtual ReadResult openArchive(const std::string& /*fileName*/,ArchiveStatus, unsigned int =4096, const Options* =NULL) { return ReadResult(ReadResult::FILE_NOT_HANDLED); } @@ -276,12 +241,6 @@ class OSGDB_EXPORT ReaderWriter : public osg::Object virtual WriteResult writeHeightField(const osg::HeightField& /*heightField*/,std::ostream& /*fout*/,const Options* =NULL) {return WriteResult(WriteResult::FILE_NOT_HANDLED); } virtual WriteResult writeNode(const osg::Node& /*node*/,std::ostream& /*fout*/,const Options* =NULL) { return WriteResult(WriteResult::FILE_NOT_HANDLED); } - - - protected: - - osgDB::ReentrantMutex _serializerMutex; - }; } diff --git a/src/osgDB/Registry.cpp b/src/osgDB/Registry.cpp index 4e2dfd35e..efea88e92 100644 --- a/src/osgDB/Registry.cpp +++ b/src/osgDB/Registry.cpp @@ -1120,7 +1120,7 @@ struct Registry::ReadObjectFunctor : public Registry::ReadFunctor { ReadObjectFunctor(const std::string& filename, const ReaderWriter::Options* options):ReadFunctor(filename,options) {} - virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw) const { return rw.threadSafe_readObject(_filename, _options); } + virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw) const { return rw.readObject(_filename, _options); } virtual bool isValid(ReaderWriter::ReadResult& readResult) const { return readResult.validObject(); } virtual bool isValid(osg::Object* object) const { return object!=0; } }; @@ -1129,7 +1129,7 @@ struct Registry::ReadImageFunctor : public Registry::ReadFunctor { ReadImageFunctor(const std::string& filename, const ReaderWriter::Options* options):ReadFunctor(filename,options) {} - virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw)const { return rw.threadSafe_readImage(_filename, _options); } + virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw)const { return rw.readImage(_filename, _options); } virtual bool isValid(ReaderWriter::ReadResult& readResult) const { return readResult.validImage(); } virtual bool isValid(osg::Object* object) const { return dynamic_cast(object)!=0; } }; @@ -1138,7 +1138,7 @@ struct Registry::ReadHeightFieldFunctor : public Registry::ReadFunctor { ReadHeightFieldFunctor(const std::string& filename, const ReaderWriter::Options* options):ReadFunctor(filename,options) {} - virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw) const { return rw.threadSafe_readHeightField(_filename, _options); } + virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw) const { return rw.readHeightField(_filename, _options); } virtual bool isValid(ReaderWriter::ReadResult& readResult) const { return readResult.validHeightField(); } virtual bool isValid(osg::Object* object) const { return dynamic_cast(object)!=0; } }; @@ -1147,7 +1147,7 @@ struct Registry::ReadNodeFunctor : public Registry::ReadFunctor { ReadNodeFunctor(const std::string& filename, const ReaderWriter::Options* options):ReadFunctor(filename,options) {} - virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw) const { return rw.threadSafe_readNode(_filename, _options); } + virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw) const { return rw.readNode(_filename, _options); } virtual bool isValid(ReaderWriter::ReadResult& readResult) const { return readResult.validNode(); } virtual bool isValid(osg::Object* object) const { return dynamic_cast(object)!=0; } @@ -1163,7 +1163,7 @@ struct Registry::ReadArchiveFunctor : public Registry::ReadFunctor ReaderWriter::ArchiveStatus _status; unsigned int _indexBlockSizeHint; - virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw) const { return rw.threadSafe_openArchive(_filename, _status, _indexBlockSizeHint, _options); } + virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw) const { return rw.openArchive(_filename, _status, _indexBlockSizeHint, _options); } virtual bool isValid(ReaderWriter::ReadResult& readResult) const { return readResult.validArchive(); } virtual bool isValid(osg::Object* object) const { return dynamic_cast(object)!=0; } @@ -1192,7 +1192,7 @@ ReaderWriter::ReadResult Registry::read(const ReadFunctor& readFunctor) osg::ref_ptr options = new ReaderWriter::Options; options->setDatabasePath(archiveName); - return archive->threadSafe_readObject(fileName,options.get()); + return archive->readObject(fileName,options.get()); } // if filename contains archive @@ -1387,7 +1387,7 @@ ReaderWriter::WriteResult Registry::writeObjectImplementation(const Object& obj, AvailableReaderWriterIterator itr(_rwList); for(;itr.valid();++itr) { - ReaderWriter::WriteResult rr = itr->threadSafe_writeObject(obj,fileName,_options.get()); + ReaderWriter::WriteResult rr = itr->writeObject(obj,fileName,_options.get()); if (rr.success()) return rr; else results.push_back(rr); } @@ -1398,7 +1398,7 @@ ReaderWriter::WriteResult Registry::writeObjectImplementation(const Object& obj, { for(;itr.valid();++itr) { - ReaderWriter::WriteResult rr = itr->threadSafe_writeObject(obj,fileName,_options.get()); + ReaderWriter::WriteResult rr = itr->writeObject(obj,fileName,_options.get()); if (rr.success()) return rr; else results.push_back(rr); } @@ -1430,7 +1430,7 @@ ReaderWriter::WriteResult Registry::writeImageImplementation(const Image& image, AvailableReaderWriterIterator itr(_rwList); for(;itr.valid();++itr) { - ReaderWriter::WriteResult rr = itr->threadSafe_writeImage(image,fileName,_options.get()); + ReaderWriter::WriteResult rr = itr->writeImage(image,fileName,_options.get()); if (rr.success()) return rr; else results.push_back(rr); } @@ -1441,7 +1441,7 @@ ReaderWriter::WriteResult Registry::writeImageImplementation(const Image& image, { for(;itr.valid();++itr) { - ReaderWriter::WriteResult rr = itr->threadSafe_writeImage(image,fileName,_options.get()); + ReaderWriter::WriteResult rr = itr->writeImage(image,fileName,_options.get()); if (rr.success()) return rr; else results.push_back(rr); } @@ -1472,7 +1472,7 @@ ReaderWriter::WriteResult Registry::writeHeightFieldImplementation(const HeightF AvailableReaderWriterIterator itr(_rwList); for(;itr.valid();++itr) { - ReaderWriter::WriteResult rr = itr->threadSafe_writeHeightField(HeightField,fileName,_options.get()); + ReaderWriter::WriteResult rr = itr->writeHeightField(HeightField,fileName,_options.get()); if (rr.success()) return rr; else results.push_back(rr); } @@ -1483,7 +1483,7 @@ ReaderWriter::WriteResult Registry::writeHeightFieldImplementation(const HeightF { for(;itr.valid();++itr) { - ReaderWriter::WriteResult rr = itr->threadSafe_writeHeightField(HeightField,fileName,_options.get()); + ReaderWriter::WriteResult rr = itr->writeHeightField(HeightField,fileName,_options.get()); if (rr.success()) return rr; else results.push_back(rr); } @@ -1514,7 +1514,7 @@ ReaderWriter::WriteResult Registry::writeNodeImplementation(const Node& node,con AvailableReaderWriterIterator itr(_rwList); for(;itr.valid();++itr) { - ReaderWriter::WriteResult rr = itr->threadSafe_writeNode(node,fileName,_options.get()); + ReaderWriter::WriteResult rr = itr->writeNode(node,fileName,_options.get()); if (rr.success()) return rr; else results.push_back(rr); } @@ -1525,7 +1525,7 @@ ReaderWriter::WriteResult Registry::writeNodeImplementation(const Node& node,con { for(;itr.valid();++itr) { - ReaderWriter::WriteResult rr = itr->threadSafe_writeNode(node,fileName,_options.get()); + ReaderWriter::WriteResult rr = itr->writeNode(node,fileName,_options.get()); if (rr.success()) return rr; else results.push_back(rr); } diff --git a/src/osgPlugins/net/ReaderWriterNET.cpp b/src/osgPlugins/net/ReaderWriterNET.cpp index 604b1d9ce..c2e2b4d48 100644 --- a/src/osgPlugins/net/ReaderWriterNET.cpp +++ b/src/osgPlugins/net/ReaderWriterNET.cpp @@ -122,11 +122,11 @@ class NetReader : public osgDB::ReaderWriter { switch(objectType) { - case(OBJECT): return rw->threadSafe_readObject(fin,options); - case(ARCHIVE): return rw->threadSafe_openArchive(fin,options); - case(IMAGE): return rw->threadSafe_readImage(fin,options); - case(HEIGHTFIELD): return rw->threadSafe_readHeightField(fin,options); - case(NODE): return rw->threadSafe_readNode(fin,options); + case(OBJECT): return rw->readObject(fin,options); + case(ARCHIVE): return rw->openArchive(fin,options); + case(IMAGE): return rw->readImage(fin,options); + case(HEIGHTFIELD): return rw->readHeightField(fin,options); + case(NODE): return rw->readNode(fin,options); default: break; } return ReadResult::FILE_NOT_HANDLED; diff --git a/src/osgPlugins/osga/OSGA_Archive.cpp b/src/osgPlugins/osga/OSGA_Archive.cpp index fff94a3b1..f1cd1dbad 100644 --- a/src/osgPlugins/osga/OSGA_Archive.cpp +++ b/src/osgPlugins/osga/OSGA_Archive.cpp @@ -230,6 +230,8 @@ OSGA_Archive::~OSGA_Archive() bool OSGA_Archive::open(const std::string& filename, ArchiveStatus status, unsigned int indexBlockSize) { + SERIALIZER(); + if (status==READ) { _status = status; @@ -289,9 +291,11 @@ bool OSGA_Archive::open(const std::string& filename, ArchiveStatus status, unsig bool OSGA_Archive::open(std::istream& fin) { + SERIALIZER(); + osg::notify(osg::NOTICE)<<"OSGA_Archive::open"<(_output).rdbuf(fin.rdbuf()); - return false; + static_cast(_input).rdbuf(fin.rdbuf()); + return _open(_input); } bool OSGA_Archive::_open(std::istream& input) @@ -359,6 +363,8 @@ bool OSGA_Archive::_open(std::istream& input) void OSGA_Archive::close() { + SERIALIZER(); + _input.close(); if (_status==WRITE) @@ -375,6 +381,8 @@ std::string OSGA_Archive::getMasterFileName() const bool OSGA_Archive::getFileNames(FileNameList& fileNameList) const { + SERIALIZER(); + fileNameList.clear(); fileNameList.reserve(_indexMap.size()); for(FileNamePositionMap::const_iterator itr=_indexMap.begin(); @@ -389,6 +397,8 @@ bool OSGA_Archive::getFileNames(FileNameList& fileNameList) const void OSGA_Archive::writeIndexBlocks() { + SERIALIZER(); + if (_status==WRITE) { for(IndexBlockList::iterator itr=_indexBlockList.begin(); @@ -410,6 +420,8 @@ bool OSGA_Archive::fileExists(const std::string& filename) const bool OSGA_Archive::addFileReference(pos_type position, size_type size, const std::string& fileName) { + SERIALIZER(); + if (_status==READ) { osg::notify(osg::INFO)<<"OSGA_Archive::getPositionForNewEntry("< #include +#include +#include + +#define SERIALIZER() OpenThreads::ScopedLock lock(_serializerMutex) + class OSGA_Archive : public osgDB::Archive { public: @@ -78,6 +83,8 @@ class OSGA_Archive : public osgDB::Archive protected: + mutable osgDB::ReentrantMutex _serializerMutex; + #if defined(_MSC_VER) typedef __int64 pos_type; typedef __int64 size_type; diff --git a/src/osgPlugins/osga/ReaderWriterOSGA.cpp b/src/osgPlugins/osga/ReaderWriterOSGA.cpp index f34934105..84483ce70 100644 --- a/src/osgPlugins/osga/ReaderWriterOSGA.cpp +++ b/src/osgPlugins/osga/ReaderWriterOSGA.cpp @@ -61,7 +61,7 @@ public: osg::ref_ptr local_options = new ReaderWriter::Options; local_options->setDatabasePath(file); - ReadResult result_2 = result.getArchive()->threadSafe_readImage(result.getArchive()->getMasterFileName(),local_options.get()); + ReadResult result_2 = result.getArchive()->readImage(result.getArchive()->getMasterFileName(),local_options.get()); // register the archive so that it is cached for future use. @@ -81,7 +81,7 @@ public: osg::ref_ptr local_options = new ReaderWriter::Options; local_options->setDatabasePath(file); - ReadResult result_2 = result.getArchive()->threadSafe_readNode(result.getArchive()->getMasterFileName(),local_options.get()); + ReadResult result_2 = result.getArchive()->readNode(result.getArchive()->getMasterFileName(),local_options.get()); // register the archive so that it is cached for future use. diff --git a/src/osgTerrain/DataSet.cpp b/src/osgTerrain/DataSet.cpp index 20c17e601..5483abad4 100644 --- a/src/osgTerrain/DataSet.cpp +++ b/src/osgTerrain/DataSet.cpp @@ -3724,13 +3724,13 @@ void DataSet::_equalizeRow(Row& row) void DataSet::_writeNodeFile(const osg::Node& node,const std::string& filename) { - if (_archive.valid()) _archive->threadSafe_writeNode(node,filename); + if (_archive.valid()) _archive->writeNode(node,filename); else osgDB::writeNodeFile(node, filename); } void DataSet::_writeImageFile(const osg::Image& image,const std::string& filename) { - if (_archive.valid()) _archive->threadSafe_writeImage(image,filename); + if (_archive.valid()) _archive->writeImage(image,filename); else osgDB::writeImageFile(image, filename); }