///remove tasks from ODWaveTrackTaskQueues that have been done. Schedules new ones if they exist ///Also remove queues that have become empty. void ODManager::UpdateQueues() { mQueuesMutex.Lock(); for(int i=0;i<mQueues.size();i++) { if(mQueues[i]->IsFrontTaskComplete()) { mQueues[i]->RemoveFrontTask(); //schedule next. if(!mQueues[i]->IsEmpty()) { //we need to release the lock on the queue vector before using the task vector's lock or we deadlock //so get a temp. ODWaveTrackTaskQueue* queue; queue = mQueues[i]; mQueuesMutex.Unlock(); AddTask(queue->GetFrontTask()); mQueuesMutex.Lock(); } } //if the queue is empty delete it. if(mQueues[i]->IsEmpty()) { delete mQueues[i]; mQueues.erase(mQueues.begin()+i); i--; } } mQueuesMutex.Unlock(); }
///remove tasks from ODWaveTrackTaskQueues that have been done. Schedules NEW ones if they exist ///Also remove queues that have become empty. void ODManager::UpdateQueues() { mQueuesMutex.Lock(); for(unsigned int i=0;i<mQueues.size();i++) { if(mQueues[i]->IsFrontTaskComplete()) { //this should DELETE and remove the front task instance. mQueues[i]->RemoveFrontTask(); //schedule next. if(!mQueues[i]->IsEmpty()) { //we need to release the lock on the queue vector before using the task vector's lock or we deadlock //so get a temp. ODWaveTrackTaskQueue* queue = mQueues[i].get(); AddTask(queue->GetFrontTask()); } } //if the queue is empty DELETE it. if(mQueues[i]->IsEmpty()) { mQueues.erase(mQueues.begin()+i); i--; } } mQueuesMutex.Unlock(); }