int CXBMCRenderManager::WaitForBuffer(volatile bool& bStop, int timeout) { CSingleLock lock2(m_presentlock); // check if gui is active and discard buffer if not // this keeps videoplayer going if (!m_bRenderGUI || !g_application.GetRenderGUI()) { m_bRenderGUI = false; double presenttime = 0; double clock = GetPresentTime(); if (!m_queued.empty()) { int idx = m_queued.front(); presenttime = m_Queue[idx].timestamp; } else presenttime = clock + 0.02; int sleeptime = (presenttime - clock) * 1000; if (sleeptime < 0) sleeptime = 0; sleeptime = std::min(sleeptime, 20); m_presentevent.wait(lock2, sleeptime); DiscardBuffer(); return 0; } XbmcThreads::EndTime endtime(timeout); while(m_free.empty()) { m_presentevent.wait(lock2, std::min(50, timeout)); if(endtime.IsTimePast() || bStop) { if (timeout != 0 && !bStop) { CLog::Log(LOGWARNING, "CRenderManager::WaitForBuffer - timeout waiting for buffer"); m_waitForBufferCount++; if (m_waitForBufferCount > 2) { m_bRenderGUI = false; } } return -1; } } m_waitForBufferCount = 0; // make sure overlay buffer is released, this won't happen on AddOverlay m_overlays.Release(m_free.front()); // return buffer level return m_queued.size() + m_discard.size();; }
ssize_t DataSocketIO::ReceiveData(int aFd) { MOZ_ASSERT(aFd >= 0); UnixSocketIOBuffer* incoming; nsresult rv = QueryReceiveBuffer(&incoming); if (NS_FAILED(rv)) { /* an error occured */ GetConsumerThread()->PostTask(FROM_HERE, new SocketRequestClosingTask(this)); return -1; } ssize_t res = incoming->Receive(aFd); if (res < 0) { /* an I/O error occured */ DiscardBuffer(); GetConsumerThread()->PostTask(FROM_HERE, new SocketRequestClosingTask(this)); return -1; } else if (!res) { /* EOF or peer shut down sending */ DiscardBuffer(); GetConsumerThread()->PostTask(FROM_HERE, new SocketRequestClosingTask(this)); return 0; } #ifdef MOZ_TASK_TRACER /* Make unix socket creation events to be the source events of TaskTracer, * and originate the rest correlation tasks from here. */ AutoSourceEvent taskTracerEvent(SourceEventType::Unixsocket); #endif ConsumeBuffer(); return res; }