Thanks JS, fix now merged and submitted to SVN.  Copy and paste
anti-pattern strikes again!

On Wed, Sep 24, 2008 at 4:22 PM, Jean-Sébastien Guay
<[EMAIL PROTECTED]> wrote:
> Hi all,
>
> I'm getting this when building OSG updated this morning, in osgunittests:
>
> 1>MultiThreadRead.obj : error LNK2019: unresolved external symbol
> "__declspec(dllimport) public: __thiscall RefBarrier::RefBarrier(int)"
> (__imp_??0RefBarrier@@[EMAIL PROTECTED]@Z) referenced in function "void 
> __cdecl
> runMultiThreadReadTests(int,class osg::ArgumentParser &)"
> (?runMultiThreadReadTests@@[EMAIL PROTECTED]@@@Z)
> 1>MultiThreadRead.obj : error LNK2019: unresolved external symbol
> "__declspec(dllimport) public: virtual __thiscall
> RefBarrier::~RefBarrier(void)" (__imp_??1RefBarrier@@[EMAIL PROTECTED]) 
> referenced in
> function "public: virtual void * __thiscall RefBarrier::`scalar deleting
> destructor'(unsigned int)" (??_GRefBarrier@@[EMAIL PROTECTED])
>
> I don't think you need the OSG_EXPORT on RefBarrier unless you're compiling
> the class to a DLL, and in this case MultiThreadRead.cpp gets compiled into
> an executable...
>
> Removing it makes the example compile and link correctly.
>
> J-S
> --
> ______________________________________________________
> Jean-Sebastien Guay    [EMAIL PROTECTED]
>                               http://www.cm-labs.com/
>                        http://whitestar02.webhop.org/
>
> /* OpenSceneGraph example, osgunittests.
> *
> *  Permission is hereby granted, free of charge, to any person obtaining a
> copy
> *  of this software and associated documentation files (the "Software"), to
> deal
> *  in the Software without restriction, including without limitation the
> rights
> *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> *  copies of the Software, and to permit persons to whom the Software is
> *  furnished to do so, subject to the following conditions:
> *
> *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
> OR
> *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> THE
> *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> FROM,
> *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> *  THE SOFTWARE.
> */
>
> #include <osg/Referenced>
> #include <osgDB/ReadFile>
> #include <osgDB/Registry>
>
> #include <OpenThreads/Thread>
> #include <OpenThreads/ScopedLock>
>
> struct RefBarrier : public osg::Referenced, public OpenThreads::Barrier
> {
>    RefBarrier(int numThreads):
>        OpenThreads::Barrier(numThreads) {}
> };
>
> class ReadThread : public osg::Referenced, public OpenThreads::Thread
> {
> public:
>
>    ReadThread():
>        _done(false)
>    {
>    }
>
>    virtual ~ReadThread()
>    {
>        _done = true;
>
>        while(isRunning()) OpenThreads::Thread::YieldCurrentThread();
>    }
>
>    void addFileName(const std::string& filename)
>    {
>        _fileNames.push_back(filename);
>    }
>
>    void setStartBarrier(RefBarrier* barrier) { _startBarrier = barrier; }
>    void setEndBarrier(RefBarrier* barrier) { _endBarrier = barrier; }
>
>    virtual void run()
>    {
>        if (_startBarrier.valid())
>        {
> #if VERBOSE
>            std::cout<<"Waiting on start block "<<this<<std::endl;
> #endif
>            _startBarrier->block();
>        }
>
> #if VERBOSE
>        std::cout<<"Starting "<<this<<std::endl;
> #endif
>
>        do
>        {
>            if (!_fileNames.empty())
>            {
>                // take front filename;
>                std::string filename = _fileNames.front();
>                _fileNames.erase(_fileNames.begin());
>
> #if VERBOSE
>                std::cout<<"Reading "<<filename;
> #endif
>                osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(filename);
> #if VERBOSE
>                if (node.valid()) std::cout<<"..  OK"<<std::endl;
>                else std::cout<<"..  FAILED"<<std::endl;
> #endif
>            }
>
>        } while (!testCancel() && !_fileNames.empty() && !_done);
>
>        if (_endBarrier.valid())
>        {
> #if VERBOSE
>            std::cout<<"Waiting on end block "<<this<<std::endl;
> #endif
>            _endBarrier->block();
>        }
>
> #if VERBOSE
>        std::cout<<"Completed"<<this<<std::endl;
> #endif
>    }
>
>    typedef std::list<std::string> FileNames;
>    FileNames                   _fileNames;
>    bool                        _done;
>    osg::ref_ptr<RefBarrier>    _startBarrier;
>    osg::ref_ptr<RefBarrier>    _endBarrier;
> };
>
>
>
> class SerializerReadFileCallback : public osgDB::Registry::ReadFileCallback
> {
> public:
>
>    virtual osgDB::ReaderWriter::ReadResult openArchive(const std::string&
> filename,osgDB::ReaderWriter::ArchiveStatus status, unsigned int
> indexBlockSizeHint, const osgDB::ReaderWriter::Options* useObjectCache)
>    {
>        OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
>        return
> osgDB::Registry::instance()->openArchiveImplementation(filename, status,
> indexBlockSizeHint, useObjectCache);
>    }
>
>    virtual osgDB::ReaderWriter::ReadResult readObject(const std::string&
> filename, const osgDB::ReaderWriter::Options* options)
>    {
>        OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
>        return
> osgDB::Registry::instance()->readObjectImplementation(filename,options);
>    }
>
>    virtual osgDB::ReaderWriter::ReadResult readImage(const std::string&
> filename, const osgDB::ReaderWriter::Options* options)
>    {
>        OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
>        return
> osgDB::Registry::instance()->readImageImplementation(filename,options);
>    }
>
>    virtual osgDB::ReaderWriter::ReadResult readHeightField(const
> std::string& filename, const osgDB::ReaderWriter::Options* options)
>    {
>        OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
>        return
> osgDB::Registry::instance()->readHeightFieldImplementation(filename,options);
>    }
>
>    virtual osgDB::ReaderWriter::ReadResult readNode(const std::string&
> filename, const osgDB::ReaderWriter::Options* options)
>    {
>        OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
>        return
> osgDB::Registry::instance()->readNodeImplementation(filename,options);
>    }
>
>    virtual osgDB::ReaderWriter::ReadResult readShader(const std::string&
> filename, const osgDB::ReaderWriter::Options* options)
>    {
>        OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
>        return
> osgDB::Registry::instance()->readShaderImplementation(filename,options);
>    }
>
> protected:
>       virtual ~SerializerReadFileCallback() {}
>
>       OpenThreads::Mutex _mutex;
> };
>
>
>
> void runMultiThreadReadTests(int numThreads, osg::ArgumentParser& arguments)
> {
> #if VERBOSE
>    osg::notify(osg::NOTICE)<<"runMultiThreadReadTests() --
> running"<<std::endl;
> #endif
>
>
>    if (arguments.read("preload"))
>    {
>
>  
> osgDB::Registry::instance()->loadLibrary(osgDB::Registry::instance()->createLibraryNameForExtension("osg"));
>
>  
> osgDB::Registry::instance()->loadLibrary(osgDB::Registry::instance()->createLibraryNameForExtension("rgb"));
>
>  
> osgDB::Registry::instance()->loadLibrary(osgDB::Registry::instance()->createLibraryNameForExtension("jpeg"));
>
>  
> osgDB::Registry::instance()->loadLibrary(osgDB::Registry::instance()->createLibraryNameForExtension("ive"));
>    }
>
>    if (arguments.read("serialize"))
>    {
>        osgDB::Registry::instance()->setReadFileCallback(new
> SerializerReadFileCallback());
>    }
>
>    osg::ref_ptr<RefBarrier> startBarrier = new RefBarrier(numThreads+1);
>    osg::ref_ptr<RefBarrier> endBarrier = new RefBarrier(numThreads+1);
>
>    typedef std::list< osg::ref_ptr<ReadThread> > ReadThreads;
>    ReadThreads readThreads;
>
>    for(unsigned int i=0; i<numThreads; ++i)
>    {
>        osg::ref_ptr<ReadThread> readThread = new ReadThread;
>
>        readThread->setProcessorAffinity(numThreads % 4);
>
>        readThread->setStartBarrier(startBarrier.get());
>        readThread->setEndBarrier(endBarrier.get());
>
>        readThread->addFileName("cessna.osg");
>        readThread->addFileName("glider.osg");
>        readThread->addFileName("town.ive");
>
>        readThreads.push_back(readThread.get());
>
>        readThread->start();
>
>    }
>
>    startBarrier->block();
>    endBarrier->block();
>
> #if VERBOSE
>    osg::notify(osg::NOTICE)<<"runMultiThreadReadTests() --
> completed."<<std::endl;
> #endif
> }
>
> _______________________________________________
> osg-submissions mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org
>
>
_______________________________________________
osg-submissions mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org

Reply via email to