osgEarth 2.1.1
|
Public Member Functions | |
TaskRequestQueue () | |
void | add (TaskRequest *request) |
TaskRequest * | get () |
void | clear () |
void | setDone () |
void | setStamp (int value) |
int | getStamp () const |
unsigned int | getNumRequests () const |
Private Attributes | |
TaskRequestPriorityMap | _requests |
OpenThreads::Mutex | _mutex |
OpenThreads::Condition | _cond |
volatile bool | _done |
int | _stamp |
Definition at line 122 of file TaskService.
TaskRequestQueue::TaskRequestQueue | ( | ) |
Definition at line 67 of file TaskService.cpp.
: osg::Referenced( true ), _done( false ) { }
void TaskRequestQueue::add | ( | TaskRequest * | request | ) |
Definition at line 88 of file TaskService.cpp.
{ request->setState( TaskRequest::STATE_PENDING ); // install a progress callback if one isn't already installed if ( !request->getProgressCallback() ) request->setProgressCallback( new ProgressCallback() ); ScopedLock<Mutex> lock(_mutex); // insert by priority. _requests.insert( std::pair<float,TaskRequest*>(request->getPriority(), request) ); #if 0 // insert by priority. bool inserted = false; for( TaskRequestList::iterator i = _requests.begin(); i != _requests.end(); i++ ) { if ( request->getPriority() > i->get()->getPriority() ) { _requests.insert( i, request ); inserted = true; //OE_NOTICE << "TaskRequestQueue size=" << _requests.size() << std::endl; break; } } if ( !inserted ) _requests.push_back( request ); #endif // since there is data in the queue, wake up one waiting task thread. _cond.signal(); }
void TaskRequestQueue::clear | ( | ) |
Definition at line 74 of file TaskService.cpp.
TaskRequest * TaskRequestQueue::get | ( | ) |
Definition at line 124 of file TaskService.cpp.
{ ScopedLock<Mutex> lock(_mutex); while ( !_done && _requests.empty() ) { // releases the mutex and waits on the condition. _cond.wait( &_mutex ); } if ( _done ) { return 0L; } osg::ref_ptr<TaskRequest> next = _requests.begin()->second.get(); //_requests.front(); _requests.erase( _requests.begin() ); //_requests.pop_front(); // I'm done, someone else take a turn: // (technically this shouldn't be necessary since add() bumps the semaphore once // for each request in the queue) _cond.signal(); return next.release(); }
unsigned int TaskRequestQueue::getNumRequests | ( | ) | const |
Definition at line 81 of file TaskService.cpp.
int osgEarth::TaskRequestQueue::getStamp | ( | ) | const [inline] |
Definition at line 134 of file TaskService.
{ return _stamp; }
void TaskRequestQueue::setDone | ( | ) |
Definition at line 151 of file TaskService.cpp.
{ // we need to obtain the mutex since we're using the Condition ScopedLock<Mutex> lock(_mutex); _done = true; // wake everyone up so they can see the _done flag set and exit. //_cond.broadcast(); // alternative to buggy win32 broadcast (OSG pre-r10457 on windows) for(int i=0; i<128; i++) _cond.signal(); }
void osgEarth::TaskRequestQueue::setStamp | ( | int | value | ) | [inline] |
Definition at line 133 of file TaskService.
{ _stamp = value; }
OpenThreads::Condition osgEarth::TaskRequestQueue::_cond [private] |
Definition at line 141 of file TaskService.
volatile bool osgEarth::TaskRequestQueue::_done [private] |
Definition at line 142 of file TaskService.
OpenThreads::Mutex osgEarth::TaskRequestQueue::_mutex [private] |
Definition at line 140 of file TaskService.
Definition at line 139 of file TaskService.
int osgEarth::TaskRequestQueue::_stamp [private] |
Definition at line 144 of file TaskService.