Notification* TimedNotificationQueue::waitDequeueNotification() { for (;;) { _mutex.lock(); NfQueue::iterator it = _nfQueue.begin(); if (it != _nfQueue.end()) { _mutex.unlock(); Clock::ClockDiff sleep = -it->first.elapsed(); if (sleep <= 0) { return dequeueOne(it).duplicate(); } else if (!wait(sleep)) { return dequeueOne(it).duplicate(); } else continue; } else { _mutex.unlock(); } _nfAvailable.wait(); } }
void PriorityNotificationQueue::dispatch(NotificationCenter& notificationCenter) { FastMutex::ScopedLock lock(_mutex); Notification::Ptr pNf = dequeueOne(); while (pNf) { notificationCenter.postNotification(pNf); pNf = dequeueOne(); } }
Notification* PriorityNotificationQueue::waitDequeueNotification(long milliseconds) { Notification::Ptr pNf; WaitInfo* pWI = 0; { FastMutex::ScopedLock lock(_mutex); pNf = dequeueOne(); if (pNf) return pNf.duplicate(); pWI = new WaitInfo; _waitQueue.push_back(pWI); } if (pWI->nfAvailable.tryWait(milliseconds)) { pNf = pWI->pNf; } else { FastMutex::ScopedLock lock(_mutex); pNf = pWI->pNf; for (WaitQueue::iterator it = _waitQueue.begin(); it != _waitQueue.end(); ++it) { if (*it == pWI) { _waitQueue.erase(it); break; } } } delete pWI; return pNf.duplicate(); }
Notification* TimedNotificationQueue::waitDequeueNotification(long milliseconds) { while (milliseconds >= 0) { _mutex.lock(); NfQueue::iterator it = _nfQueue.begin(); if (it != _nfQueue.end()) { _mutex.unlock(); Clock now; Clock::ClockDiff sleep = it->first - now; if (sleep <= 0) { return dequeueOne(it).duplicate(); } else if (sleep <= 1000*Clock::ClockDiff(milliseconds)) { if (!wait(sleep)) { return dequeueOne(it).duplicate(); } else { milliseconds -= static_cast<long>((now.elapsed() + 999)/1000); continue; } } } else { _mutex.unlock(); } if (milliseconds > 0) { Clock now; _nfAvailable.tryWait(milliseconds); milliseconds -= static_cast<long>((now.elapsed() + 999)/1000); } else return 0; } return 0; }
Notification* PriorityNotificationQueue::waitDequeueNotification() { Notification::Ptr pNf; WaitInfo* pWI = 0; { FastMutex::ScopedLock lock(_mutex); pNf = dequeueOne(); if (pNf) return pNf.duplicate(); pWI = new WaitInfo; _waitQueue.push_back(pWI); } pWI->nfAvailable.wait(); pNf = pWI->pNf; delete pWI; return pNf.duplicate(); }
Notification* PriorityNotificationQueue::dequeueNotification() { FastMutex::ScopedLock lock(_mutex); return dequeueOne().duplicate(); }
Notification* NotificationQueue::dequeueNotification() { FastMutex::ScopedLock lock(_mutex); return dequeueOne(); }