FlushContext::List FlushEngine::getTargetList(bool includeFlushingTargets) const { FlushContext::List ret; { std::lock_guard<std::mutex> guard(_lock); for (const auto & it : _handlers) { IFlushHandler & handler(*it.second); search::SerialNum serial(handler.getCurrentSerialNumber()); LOG(spam, "Checking FlushHandler '%s' current serial = %ld", handler.getName().c_str(), serial); IFlushTarget::List lst = handler.getFlushTargets(); for (const IFlushTarget::SP & target : lst) { LOG(spam, "Checking target '%s' with flushedSerialNum = %ld", target->getName().c_str(), target->getFlushedSerialNum()); if (!isFlushing(guard, FlushContext::createName(handler, *target)) || includeFlushingTargets) { ret.push_back(std::make_shared<FlushContext>(it.second, std::make_shared<CachedFlushTarget>(target), serial)); } else { LOG(debug, "Target '%s' with flushedSerialNum = %ld already has a flush going. Local last serial = %ld.", target->getName().c_str(), target->getFlushedSerialNum(), serial); } } } } return ret; }
STDMETHODIMP QAsyncReader::WaitForNext(DWORD timeout, IMediaSample **sample, DWORD_PTR *user) { QMutexLocker locker(&m_mutexWait); if (!sample ||!user) { return E_POINTER; } *sample = 0; *user = 0; AsyncRequest r = getNextRequest(); if (r.sample == 0) { //there is no request in the queue if (isFlushing()) { return VFW_E_WRONG_STATE; } else { //First we need to lock the mutex if (m_requestWait.wait(&m_mutexWait, timeout) == false) { return VFW_E_TIMEOUT; } if (isFlushing()) { return VFW_E_WRONG_STATE; } r = getNextRequest(); } } //at this point we're sure to have a request to proceed if (r.sample == 0) { return E_FAIL; } *sample = r.sample; *user = r.user; return SyncReadAligned(r.sample); }