summaryrefslogtreecommitdiff
path: root/source/api_wrappers/linux/CSemaphoreQueue.h
diff options
context:
space:
mode:
authorViktor Mladenovski <viktor.mladenovski@stericsson.com>2011-05-20 14:10:59 +0200
committerViktor Mladenovski <viktor.mladenovski@stericsson.com>2011-05-20 14:10:59 +0200
commitf7e95217e936da34d7124aaced590692eb515923 (patch)
tree2d9ef4750a67d9d1dd3fe9180a4fef2929fad54b /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.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 */
+