You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
2.1 KiB
101 lines
2.1 KiB
//////////////////////////////////////////////////////////////////// |
|
// EventQueue.cpp |
|
// |
|
// Copyright 2007 cDc@seacave |
|
// Distributed under the Boost Software License, Version 1.0 |
|
// (See http://www.boost.org/LICENSE_1_0.txt) |
|
|
|
#include "Common.h" |
|
#include "EventQueue.h" |
|
|
|
using namespace SEACAVE; |
|
|
|
|
|
// D E F I N E S /////////////////////////////////////////////////// |
|
|
|
|
|
// S T R U C T S /////////////////////////////////////////////////// |
|
|
|
/*-----------------------------------------------------------* |
|
* EventQueue class implementation * |
|
*-----------------------------------------------------------*/ |
|
|
|
void EventQueue::Clear() |
|
{ |
|
m_cs.Clear(); |
|
m_sem.Clear(); |
|
m_events.Empty(); |
|
} |
|
|
|
void EventQueue::AddEvent(Event* evt) |
|
{ |
|
Lock l(m_cs); |
|
m_events.AddTail(evt); |
|
m_sem.Signal(); |
|
} |
|
void EventQueue::AddEventFirst(Event* evt) |
|
{ |
|
Lock l(m_cs); |
|
m_events.AddHead(evt); |
|
m_sem.Signal(); |
|
} |
|
|
|
Event* EventQueue::GetEvent() |
|
{ |
|
m_sem.Wait(); |
|
Lock l(m_cs); |
|
ASSERT(!m_events.IsEmpty()); |
|
return m_events.RemoveHead(); |
|
} |
|
Event* EventQueue::GetEvent(uint32_t millis) |
|
{ |
|
if (!m_sem.Wait(millis)) |
|
return NULL; |
|
Lock l(m_cs); |
|
if (m_events.IsEmpty()) |
|
return NULL; |
|
return m_events.RemoveHead(); |
|
} |
|
Event* EventQueue::GetEventLast() |
|
{ |
|
m_sem.Wait(); |
|
Lock l(m_cs); |
|
ASSERT(!m_events.IsEmpty()); |
|
return m_events.RemoveTail(); |
|
} |
|
Event* EventQueue::GetEventLast(uint32_t millis) |
|
{ |
|
if (!m_sem.Wait(millis)) |
|
return NULL; |
|
Lock l(m_cs); |
|
if (m_events.IsEmpty()) |
|
return NULL; |
|
return m_events.RemoveTail(); |
|
} |
|
/*----------------------------------------------------------------*/ |
|
|
|
bool EventQueue::IsEmpty() const |
|
{ |
|
Lock l(m_cs); |
|
return m_events.IsEmpty(); |
|
} |
|
|
|
uint_t EventQueue::GetSize() const |
|
{ |
|
Lock l(m_cs); |
|
return m_events.GetSize(); |
|
} |
|
/*----------------------------------------------------------------*/ |
|
|
|
|
|
|
|
/*-----------------------------------------------------------* |
|
* EventThreadPool class implementation * |
|
*-----------------------------------------------------------*/ |
|
|
|
void EventThreadPool::stop() |
|
{ |
|
ThreadPool::stop(); |
|
EventQueue::Clear(); |
|
} |
|
/*----------------------------------------------------------------*/
|
|
|