void ForEachBaselineAction::ReaderFunction::operator()() { Stopwatch watch(true); bool finished = false; size_t threadCount = _action.mathThreadCount(); size_t minRecommendedBufferSize, maxRecommendedBufferSize; MSImageSet *msImageSet = dynamic_cast<MSImageSet*>(_action._artifacts->ImageSet()); if(msImageSet != 0) { minRecommendedBufferSize = msImageSet->Reader()->GetMinRecommendedBufferSize(threadCount); maxRecommendedBufferSize = msImageSet->Reader()->GetMaxRecommendedBufferSize(threadCount) - _action.GetBaselinesInBufferCount(); } else { minRecommendedBufferSize = 1; maxRecommendedBufferSize = 2; } do { watch.Pause(); _action.WaitForBufferAvailable(minRecommendedBufferSize); size_t wantedCount = maxRecommendedBufferSize - _action.GetBaselinesInBufferCount(); size_t requestedCount = 0; boost::mutex::scoped_lock lock(_action._artifacts->IOMutex()); watch.Start(); for(size_t i=0;i<wantedCount;++i) { ImageSetIndex *index = _action.GetNextIndex(); if(index != 0) { _action._artifacts->ImageSet()->AddReadRequest(*index); ++requestedCount; delete index; } else { finished = true; break; } } if(requestedCount > 0) { _action._artifacts->ImageSet()->PerformReadRequests(); watch.Pause(); for(size_t i=0;i<requestedCount;++i) { BaselineData *baseline = _action._artifacts->ImageSet()->GetNextRequested(); boost::mutex::scoped_lock bufferLock(_action._mutex); _action._baselineBuffer.push(baseline); bufferLock.unlock(); } } lock.unlock(); _action._dataAvailable.notify_all(); watch.Start(); } while(!finished); _action.SetFinishedBaselines(); _action._dataAvailable.notify_all(); watch.Pause(); AOLogger::Debug << "Time spent on reading: " << watch.ToString() << '\n'; }
void ForEachBaselineAction::ReaderFunction::operator()() { Stopwatch watch(true); bool finished = false; size_t threadCount = _action.mathThreadCount(); size_t minRecommendedBufferSize, maxRecommendedBufferSize; MSImageSet* msImageSet = dynamic_cast<MSImageSet*>(&_action._artifacts->ImageSet()); if(msImageSet != nullptr) { minRecommendedBufferSize = msImageSet->Reader()->GetMinRecommendedBufferSize(threadCount); maxRecommendedBufferSize = msImageSet->Reader()->GetMaxRecommendedBufferSize(threadCount) - _action.GetBaselinesInBufferCount(); } else { minRecommendedBufferSize = 1; maxRecommendedBufferSize = 2; } do { watch.Pause(); _action.WaitForBufferAvailable(minRecommendedBufferSize); size_t wantedCount = maxRecommendedBufferSize - _action.GetBaselinesInBufferCount(); size_t requestedCount = 0; std::unique_lock<std::mutex> lock(_action._artifacts->IOMutex()); watch.Start(); for(size_t i=0;i<wantedCount;++i) { std::unique_ptr<ImageSetIndex> index = _action.GetNextIndex(); if(index != nullptr) { _action._artifacts->ImageSet().AddReadRequest(*index); ++requestedCount; } else { finished = true; break; } } if(requestedCount > 0) { _action._artifacts->ImageSet().PerformReadRequests(); watch.Pause(); for(size_t i=0;i<requestedCount;++i) { std::unique_ptr<BaselineData> baseline = _action._artifacts->ImageSet().GetNextRequested(); std::lock_guard<std::mutex> bufferLock(_action._mutex); _action._baselineBuffer.emplace(std::move(baseline)); } } lock.unlock(); _action._dataAvailable.notify_all(); watch.Start(); } while(!finished); _action.SetFinishedBaselines(); _action._dataAvailable.notify_all(); watch.Pause(); Logger::Debug << "Time spent on reading: " << watch.ToString() << '\n'; }