diff options
Diffstat (limited to 'source/api_wrappers/linux/CSemaphoreQueue.h')
-rw-r--r-- | source/api_wrappers/linux/CSemaphoreQueue.h | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/source/api_wrappers/linux/CSemaphoreQueue.h b/source/api_wrappers/linux/CSemaphoreQueue.h new file mode 100644 index 0000000..712d697 --- /dev/null +++ b/source/api_wrappers/linux/CSemaphoreQueue.h @@ -0,0 +1,67 @@ +/******************************************************************************* + * Copyright (C) ST-Ericsson SA 2011 + * License terms: 3-clause BSD license + ******************************************************************************/ + +#ifndef _CSEMAPHOREQUEUE_H +#define _CSEMAPHOREQUEUE_H +#include "Types.h" +#include "CEventObject.h" +#include "CSemaphore.h" +#include "pthread.h" +#include "CCriticalSection.h" +#include "CWaitableObject.h" +#include "CWaitableObjectCollection.h" + +class CSemaphore; + +enum RemoveResult { + REMOVE_SUCCESS, + REMOVE_TIMEOUT, + REMOVE_CANCEL +}; + +// An object queue implementation using WinAPI's Semaphore. +// For multi-threaded multi-processor applications with multiple producers and multiple consumers +class CSemaphoreQueue +{ +public: + CSemaphoreQueue(unsigned int MaxCount); + ~CSemaphoreQueue(); + bool AddTail(void *pObject); + RemoveResult RemoveHead(void **ppRequest, size_t mSecTimeout); + void SignalEvent(); +private: + CEventObject *m_pEventObject; + CSemaphore *m_pSemaphore; + CCriticalSectionObject m_CSLock; + void **m_Queue; + const unsigned int m_MaximumCount; + unsigned int m_CurrentCount; + unsigned int m_CurrentHead; + unsigned int m_CurrentTail; + void IncrementHead(); + void IncrementTail(); + void AddToQueueTail(void *pObject); + void *RemoveFromQueueHead(); + unsigned int GetIndex(CWaitableObject *Object) const; + // Next 2 functions not really necessary - for error case only + void DecrementTail(); + void RemoveFromQueueTail(); + CWaitableObjectCollection m_ObjectCollection; +}; + +class CPollQueue : public CSemaphoreQueue +{ +public: + CPollQueue() : CSemaphoreQueue(256) {} + RemoveResult RemovePollRequest(void **pTO, int mSecTimeout = INFINITE) { + return RemoveHead(pTO, mSecTimeout); + } + bool AddPollRequest(void *pObject) { + return AddTail(pObject); + } +}; + +#endif /* _CSEMAPHOREQUEUE_H */ + |