summaryrefslogtreecommitdiff
path: root/source/api_wrappers/linux/CSemaphoreQueue.h
diff options
context:
space:
mode:
Diffstat (limited to 'source/api_wrappers/linux/CSemaphoreQueue.h')
-rw-r--r--source/api_wrappers/linux/CSemaphoreQueue.h67
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 */
+