Hi WeSee, Sorry for the slow reply, been busy working so had to pause reviewing submissions. I have just done a review of the your suggested additional of DatabasePagerCallback and the original code and believe the callback should not be required as the functionality you want should already be possible with the existing version of the DatabasePager.
In the DatabasePager the nsigned int DatabasePager::addDatabaseThread(DatabaseThread::Mode mode, const std::string& name) is virtual, and this is the method that creates the DatabaseThread objects and assigns them to the DatabasePager. By subclassing from DatabasePager and overriding this method you could implement custom creation of threads and assignment of CPU affinity. Another approach would be to get the DatabaseThread that have been assigned to the DatabasePager via the DatabasePager::getDatabaseThread(i) method and set the affinity from this. Robert, On 12 August 2014 14:33, We See <[email protected]> wrote: > Hi Robert, > > you are right, I was very egoistic and posted a solution just solving my > problem. I went one step back and looked through the framework-glasses. The > solution I now present, works with a newly introduced > database-pager-callback. See the attached files, because a code-file says > more than thousand words, but here are some explanations anyway: > > This changes I made in DatabasePager: > > Code: > > class OSGDB_EXPORT DatabasePagerCallback : public virtual osg::Referenced > { > public: > virtual DatabaseThread* createDatabaseThread(DatabasePager* pager, > DatabaseThread::Mode mode, const std::string& name) = 0; > virtual DatabaseThread* cloneDatabaseThread(const DatabaseThread& dt, > DatabasePager* pager) = 0; > > protected: > virtual ~DatabasePagerCallback() {} > }; > > /** Set the database-pager callback to use in place of the default > database-pager calls.*/ > static void setDatabasePagerCallback( DatabasePagerCallback* cb) { > _databasePagerCallback = cb; } > > /** Get the database-pager callback.*/ > static DatabasePagerCallback* getDatabasePagerCallback() { return > _databasePagerCallback.get(); } > > static osg::ref_ptr<DatabasePagerCallback> _databasePagerCallback; > > > > > In DatabasePager::addDatabaseThread(), createDatabaseThread() will be > called, if the callback is set. So we can introduce our own database-thread > derived from DatabaseThread, where we could override the virtual methods, > like run(): > > Code: > > DatabaseThread* thread = 0; > if (_databasePagerCallback.valid()) thread = > _databasePagerCallback->createDatabaseThread(this, mode, name); > else thread = new DatabaseThread(this, mode, name); > > > > > In the copy-constructor DatabasePager::DatabasePager(const DatabasePager& > rhs), we call cloneDatabaseThread(), if the callback is present. > > With this callback we can do very much things, therefore it is ideal for a > framework like OSG is. > > Here an example, how I use it to set the CPU: > > > Code: > > class OSGDB_EXPORT MyDatabaseThread : public > osgDB::DatabasePager::DatabaseThread > { > public: > MyDatabaseThread(osgDB::DatabasePager* pager, Mode mode, const > std::string& name) > : osgDB::DatabasePager::DatabaseThread(pager, mode, name) {} > > MyDatabaseThread(const MyDatabaseThread& dt, osgDB::DatabasePager* > pager) > : osgDB::DatabasePager::DatabaseThread(dt, pager) {} > > virtual ~MyDatabaseThread() {} > > virtual void run() > { > OpenThreads::SetProcessorAffinityOfCurrentThread(2); > osgDB::DatabasePager::DatabaseThread::run(); > } > }; > > class MyDatabasePagerCallback : public virtual > osgDB::DatabasePager::DatabasePagerCallback > { > public: > virtual osgDB::DatabasePager::DatabaseThread* > createDatabaseThread(osgDB::DatabasePager* pager, > osgDB::DatabasePager::DatabaseThread::Mode mode, const std::string& name) > { > return new MyDatabaseThread(pager, mode, name); > }; > virtual osgDB::DatabasePager::DatabaseThread* > cloneDatabaseThread(const osgDB::DatabasePager::DatabaseThread& dt, > osgDB::DatabasePager* pager) > { > return new MyDatabaseThread((MyDatabaseThread&)dt, pager); > } > > protected: > virtual ~MyDatabasePagerCallback() {}; > }; > > osgDB::DatabasePager::setDatabasePagerCallback(new > MyDatabasePagerCallback); > > > > > I hope you are as satisfied as I am with this solution and could merge it. > > Thank you! > > Cheers, > WeSee > > ------------------ > Read this topic online here: > http://forum.openscenegraph.org/viewtopic.php?p=60640#60640 > > > > > Attachments: > > http://forum.openscenegraph.org//files/databasepagercallback_submission_112.zip > > > _______________________________________________ > 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
