Added DatabasePager::setProcessorAffinity(const OpenThreads::Affinity&) support to allow the database threads to have affinity to user controls sets of CPU cores.

This commit is contained in:
Robert Osfield 2016-09-27 17:52:41 +01:00
parent 171e4f0f29
commit 77c5e96ccb
2 changed files with 26 additions and 0 deletions

View File

@ -126,6 +126,10 @@ class OSGDB_EXPORT DatabasePager : public osg::NodeVisitor::DatabaseRequestHandl
};
virtual void setProcessorAffinty(const OpenThreads::Affinity& affinity);
OpenThreads::Affinity& getProcessorAffinty() { return _affinity; }
const OpenThreads::Affinity& getProcessorAffinty() const { return _affinity; }
void setUpThreads(unsigned int totalNumThreads=2, unsigned int numHttpThreads=1);
virtual unsigned int addDatabaseThread(DatabaseThread::Mode mode, const std::string& name);
@ -438,6 +442,8 @@ class OSGDB_EXPORT DatabasePager : public osg::NodeVisitor::DatabaseRequestHandl
void addLoadedDataToSceneGraph(const osg::FrameStamp &frameStamp);
OpenThreads::Affinity _affinity;
bool _done;
bool _acceptNewRequests;
bool _databasePagerThreadPaused;

View File

@ -1107,6 +1107,9 @@ DatabasePager::DatabasePager()
_dataToCompileList = new RequestQueue(this);
_dataToMergeList = new RequestQueue(this);
// test of setting the database threads affinity.
// _affinity = OpenThreads::Affinity(4,4);
setUpThreads(
osg::DisplaySettings::instance()->getNumOfDatabaseThreadsHint(),
osg::DisplaySettings::instance()->getNumOfHttpDatabaseThreadsHint());
@ -1187,6 +1190,8 @@ DatabasePager::DatabasePager(const DatabasePager& rhs)
_databaseThreads.push_back(new DatabaseThread(**dt_itr,this));
}
setProcessorAffinty(rhs.getProcessorAffinty());
_activePagedLODList = rhs._activePagedLODList->clone();
#if 1
@ -1244,6 +1249,18 @@ DatabasePager* DatabasePager::create()
new DatabasePager;
}
void DatabasePager::setProcessorAffinty(const OpenThreads::Affinity& affinity)
{
_affinity = affinity;
for(DatabaseThreadList::iterator itr=_databaseThreads.begin();
itr != _databaseThreads.end();
++itr)
{
(*itr)->setProcessorAffinity(_affinity);
}
}
void DatabasePager::setUpThreads(unsigned int totalNumThreads, unsigned int numHttpThreads)
{
_databaseThreads.clear();
@ -1280,6 +1297,9 @@ unsigned int DatabasePager::addDatabaseThread(DatabaseThread::Mode mode, const s
unsigned int pos = _databaseThreads.size();
DatabaseThread* thread = new DatabaseThread(this, mode,name);
thread->setProcessorAffinity(_affinity);
_databaseThreads.push_back(thread);
if (_startThreadCalled)