Added support for serialization of calls to ReaderWriter plugins.

This commit is contained in:
Robert Osfield 2004-11-15 19:46:10 +00:00
parent a069f67f5e
commit 2b310c6926
8 changed files with 74 additions and 33 deletions

View File

@ -134,7 +134,7 @@ int main( int argc, char **argv )
if (obj.valid())
{
std::cout<<" write to archive "<<*itr<<std::endl;
archive->writeObject(*obj, *itr);
archive->threadSafe_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->readObject(*itr);
osgDB::ReaderWriter::ReadResult result = archive->threadSafe_readObject(*itr);
osg::ref_ptr<osg::Object> obj = result.getObject();
std::cout<<"readObejct time = "<<osg::Timer::instance()->delta_m(start,osg::Timer::instance()->tick())<<std::endl;
if (obj.valid())

View File

@ -56,6 +56,7 @@ class OSGDB_EXPORT Archive : public ReaderWriter
/** Get the full list of file names available in the archive.*/
virtual bool getFileNames(FileNameList& fileNameList) const = 0;
protected:
virtual ReadResult readObject(const std::string& /*fileName*/,const Options* =NULL) = 0;
virtual ReadResult readImage(const std::string& /*fileName*/,const Options* =NULL) = 0;

View File

@ -19,7 +19,10 @@
#include <osg/Shape>
#include <osg/Node>
#include <OpenThreads/ScopedLock>
#include <osgDB/Export>
#include <osgDB/ReentrantMutex>
namespace osgDB {
@ -160,6 +163,38 @@ class OSGDB_EXPORT ReaderWriter : public osg::Object
WRITE,
CREATE
};
#define SERIALIZER() OpenThreads::ScopedLock<osgDB::ReentrantMutex> 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 writeObject(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); }
@ -188,6 +223,11 @@ class OSGDB_EXPORT ReaderWriter : public osg::Object
virtual WriteResult writeNode(const osg::Node& /*node*/,std::ostream& /*fout*/,const Options* =NULL) { return WriteResult(WriteResult::FILE_NOT_HANDLED); }
protected:
osgDB::ReentrantMutex _serializerMutex;
};
}

View File

@ -1122,7 +1122,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.readObject(_filename, _options); }
virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw) const { return rw.threadSafe_readObject(_filename, _options); }
virtual bool isValid(ReaderWriter::ReadResult& readResult) const { return readResult.validObject(); }
virtual bool isValid(osg::Object* object) const { return object!=0; }
};
@ -1131,7 +1131,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.readImage(_filename, _options); }
virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw)const { return rw.threadSafe_readImage(_filename, _options); }
virtual bool isValid(ReaderWriter::ReadResult& readResult) const { return readResult.validImage(); }
virtual bool isValid(osg::Object* object) const { return dynamic_cast<osg::Image*>(object)!=0; }
};
@ -1140,7 +1140,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.readHeightField(_filename, _options); }
virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw) const { return rw.threadSafe_readHeightField(_filename, _options); }
virtual bool isValid(ReaderWriter::ReadResult& readResult) const { return readResult.validHeightField(); }
virtual bool isValid(osg::Object* object) const { return dynamic_cast<osg::HeightField*>(object)!=0; }
};
@ -1149,7 +1149,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.readNode(_filename, _options); }
virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw) const { return rw.threadSafe_readNode(_filename, _options); }
virtual bool isValid(ReaderWriter::ReadResult& readResult) const { return readResult.validNode(); }
virtual bool isValid(osg::Object* object) const { return dynamic_cast<osg::Node*>(object)!=0; }
@ -1165,7 +1165,7 @@ struct Registry::ReadArchiveFunctor : public Registry::ReadFunctor
ReaderWriter::ArchiveStatus _status;
unsigned int _indexBlockSizeHint;
virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw) const { return rw.openArchive(_filename, _status, _indexBlockSizeHint, _options); }
virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw) const { return rw.threadSafe_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<osgDB::Archive*>(object)!=0; }
@ -1194,7 +1194,7 @@ ReaderWriter::ReadResult Registry::read(const ReadFunctor& readFunctor)
osg::ref_ptr<ReaderWriter::Options> options = new ReaderWriter::Options;
options->setDatabasePath(archiveName);
return archive->readObject(fileName,options.get());
return archive->threadSafe_readObject(fileName,options.get());
}
// if filename contains archive
@ -1392,7 +1392,7 @@ ReaderWriter::WriteResult Registry::writeObjectImplementation(const Object& obj,
AvailableReaderWriterIterator itr(_rwList);
for(;itr.valid();++itr)
{
ReaderWriter::WriteResult rr = itr->writeObject(obj,fileName,_options.get());
ReaderWriter::WriteResult rr = itr->threadSafe_writeObject(obj,fileName,_options.get());
if (rr.success()) return rr;
else results.push_back(rr);
}
@ -1403,7 +1403,7 @@ ReaderWriter::WriteResult Registry::writeObjectImplementation(const Object& obj,
{
for(;itr.valid();++itr)
{
ReaderWriter::WriteResult rr = itr->writeObject(obj,fileName,_options.get());
ReaderWriter::WriteResult rr = itr->threadSafe_writeObject(obj,fileName,_options.get());
if (rr.success()) return rr;
else results.push_back(rr);
}
@ -1434,7 +1434,7 @@ ReaderWriter::WriteResult Registry::writeImageImplementation(const Image& image,
AvailableReaderWriterIterator itr(_rwList);
for(;itr.valid();++itr)
{
ReaderWriter::WriteResult rr = itr->writeImage(image,fileName,_options.get());
ReaderWriter::WriteResult rr = itr->threadSafe_writeImage(image,fileName,_options.get());
if (rr.success()) return rr;
else results.push_back(rr);
}
@ -1445,7 +1445,7 @@ ReaderWriter::WriteResult Registry::writeImageImplementation(const Image& image,
{
for(;itr.valid();++itr)
{
ReaderWriter::WriteResult rr = itr->writeImage(image,fileName,_options.get());
ReaderWriter::WriteResult rr = itr->threadSafe_writeImage(image,fileName,_options.get());
if (rr.success()) return rr;
else results.push_back(rr);
}
@ -1475,7 +1475,7 @@ ReaderWriter::WriteResult Registry::writeHeightFieldImplementation(const HeightF
AvailableReaderWriterIterator itr(_rwList);
for(;itr.valid();++itr)
{
ReaderWriter::WriteResult rr = itr->writeHeightField(HeightField,fileName,_options.get());
ReaderWriter::WriteResult rr = itr->threadSafe_writeHeightField(HeightField,fileName,_options.get());
if (rr.success()) return rr;
else results.push_back(rr);
}
@ -1486,7 +1486,7 @@ ReaderWriter::WriteResult Registry::writeHeightFieldImplementation(const HeightF
{
for(;itr.valid();++itr)
{
ReaderWriter::WriteResult rr = itr->writeHeightField(HeightField,fileName,_options.get());
ReaderWriter::WriteResult rr = itr->threadSafe_writeHeightField(HeightField,fileName,_options.get());
if (rr.success()) return rr;
else results.push_back(rr);
}
@ -1516,7 +1516,7 @@ ReaderWriter::WriteResult Registry::writeNodeImplementation(const Node& node,con
AvailableReaderWriterIterator itr(_rwList);
for(;itr.valid();++itr)
{
ReaderWriter::WriteResult rr = itr->writeNode(node,fileName,_options.get());
ReaderWriter::WriteResult rr = itr->threadSafe_writeNode(node,fileName,_options.get());
if (rr.success()) return rr;
else results.push_back(rr);
}
@ -1527,7 +1527,7 @@ ReaderWriter::WriteResult Registry::writeNodeImplementation(const Node& node,con
{
for(;itr.valid();++itr)
{
ReaderWriter::WriteResult rr = itr->writeNode(node,fileName,_options.get());
ReaderWriter::WriteResult rr = itr->threadSafe_writeNode(node,fileName,_options.get());
if (rr.success()) return rr;
else results.push_back(rr);
}

View File

@ -122,11 +122,11 @@ class NetReader : public osgDB::ReaderWriter
{
switch(objectType)
{
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);
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);
default: break;
}
return ReadResult::FILE_NOT_HANDLED;

View File

@ -507,25 +507,25 @@ class proxy_streambuf : public std::streambuf
struct OSGA_Archive::ReadObjectFunctor : public OSGA_Archive::ReadFunctor
{
ReadObjectFunctor(const std::string& filename, const ReaderWriter::Options* options):ReadFunctor(filename,options) {}
virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw, std::istream& input) const { return rw.readObject(input, _options); }
virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw, std::istream& input) const { return rw.threadSafe_readObject(input, _options); }
};
struct OSGA_Archive::ReadImageFunctor : public OSGA_Archive::ReadFunctor
{
ReadImageFunctor(const std::string& filename, const ReaderWriter::Options* options):ReadFunctor(filename,options) {}
virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw, std::istream& input)const { return rw.readImage(input, _options); }
virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw, std::istream& input)const { return rw.threadSafe_readImage(input, _options); }
};
struct OSGA_Archive::ReadHeightFieldFunctor : public OSGA_Archive::ReadFunctor
{
ReadHeightFieldFunctor(const std::string& filename, const ReaderWriter::Options* options):ReadFunctor(filename,options) {}
virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw, std::istream& input) const { return rw.readHeightField(input, _options); }
virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw, std::istream& input) const { return rw.threadSafe_readHeightField(input, _options); }
};
struct OSGA_Archive::ReadNodeFunctor : public OSGA_Archive::ReadFunctor
{
ReadNodeFunctor(const std::string& filename, const ReaderWriter::Options* options):ReadFunctor(filename,options) {}
virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw, std::istream& input) const { return rw.readNode(input, _options); }
virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw, std::istream& input) const { return rw.threadSafe_readNode(input, _options); }
};
ReaderWriter::ReadResult OSGA_Archive::read(const ReadFunctor& readFunctor)
@ -594,7 +594,7 @@ struct OSGA_Archive::WriteObjectFunctor : public OSGA_Archive::WriteFunctor
_object(object) {}
const osg::Object& _object;
virtual ReaderWriter::WriteResult doWrite(ReaderWriter& rw, std::ostream& output) const { return rw.writeObject(_object, output, _options); }
virtual ReaderWriter::WriteResult doWrite(ReaderWriter& rw, std::ostream& output) const { return rw.threadSafe_writeObject(_object, output, _options); }
};
struct OSGA_Archive::WriteImageFunctor : public OSGA_Archive::WriteFunctor
@ -604,7 +604,7 @@ struct OSGA_Archive::WriteImageFunctor : public OSGA_Archive::WriteFunctor
_object(object) {}
const osg::Image& _object;
virtual ReaderWriter::WriteResult doWrite(ReaderWriter& rw, std::ostream& output)const { return rw.writeImage(_object, output, _options); }
virtual ReaderWriter::WriteResult doWrite(ReaderWriter& rw, std::ostream& output)const { return rw.threadSafe_writeImage(_object, output, _options); }
};
struct OSGA_Archive::WriteHeightFieldFunctor : public OSGA_Archive::WriteFunctor
@ -614,7 +614,7 @@ struct OSGA_Archive::WriteHeightFieldFunctor : public OSGA_Archive::WriteFunctor
_object(object) {}
const osg::HeightField& _object;
virtual ReaderWriter::WriteResult doWrite(ReaderWriter& rw, std::ostream& output) const { return rw.writeHeightField(_object, output, _options); }
virtual ReaderWriter::WriteResult doWrite(ReaderWriter& rw, std::ostream& output) const { return rw.threadSafe_writeHeightField(_object, output, _options); }
};
struct OSGA_Archive::WriteNodeFunctor : public OSGA_Archive::WriteFunctor
@ -624,7 +624,7 @@ struct OSGA_Archive::WriteNodeFunctor : public OSGA_Archive::WriteFunctor
_object(object) {}
const osg::Node& _object;
virtual ReaderWriter::WriteResult doWrite(ReaderWriter& rw, std::ostream& output) const { return rw.writeNode(_object, output, _options); }
virtual ReaderWriter::WriteResult doWrite(ReaderWriter& rw, std::ostream& output) const { return rw.threadSafe_writeNode(_object, output, _options); }
};
ReaderWriter::WriteResult OSGA_Archive::write(const WriteFunctor& writeFunctor)

View File

@ -61,7 +61,7 @@ public:
osg::ref_ptr<ReaderWriter::Options> local_options = new ReaderWriter::Options;
local_options->setDatabasePath(file);
ReadResult result_2 = result.getArchive()->readImage(result.getArchive()->getMasterFileName(),local_options.get());
ReadResult result_2 = result.getArchive()->threadSafe_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<ReaderWriter::Options> local_options = new ReaderWriter::Options;
local_options->setDatabasePath(file);
ReadResult result_2 = result.getArchive()->readNode(result.getArchive()->getMasterFileName(),local_options.get());
ReadResult result_2 = result.getArchive()->threadSafe_readNode(result.getArchive()->getMasterFileName(),local_options.get());
// register the archive so that it is cached for future use.

View File

@ -3724,13 +3724,13 @@ void DataSet::_equalizeRow(Row& row)
void DataSet::_writeNodeFile(const osg::Node& node,const std::string& filename)
{
if (_archive.valid()) _archive->writeNode(node,filename);
if (_archive.valid()) _archive->threadSafe_writeNode(node,filename);
else osgDB::writeNodeFile(node, filename);
}
void DataSet::_writeImageFile(const osg::Image& image,const std::string& filename)
{
if (_archive.valid()) _archive->writeImage(image,filename);
if (_archive.valid()) _archive->threadSafe_writeImage(image,filename);
else osgDB::writeImageFile(image, filename);
}