Example #1
0
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();
}
Example #4
0
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();
}
Example #7
0
Notification* NotificationQueue::dequeueNotification()
{
	FastMutex::ScopedLock lock(_mutex);
	return dequeueOne();
}