diff options
author | Viktor Mladenovski <viktor.mladenovski@stericsson.com> | 2011-05-20 14:10:59 +0200 |
---|---|---|
committer | Viktor Mladenovski <viktor.mladenovski@stericsson.com> | 2011-05-20 14:10:59 +0200 |
commit | f7e95217e936da34d7124aaced590692eb515923 (patch) | |
tree | 2d9ef4750a67d9d1dd3fe9180a4fef2929fad54b /source/api_wrappers/linux/CSemaphoreQueue.h |
Initial contribution of loader_communication
ST-Ericsson ID: 326913
ST-Ericsson FOSS-OUT ID: STETL-FOSS-OUT-10204
Change-Id: I171cfc2ee458a8a0a91a1916137d131f0f7ecee5
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 */ + |