summaryrefslogtreecommitdiff
path: root/source/api_wrappers/linux/CSemaphoreQueue.h
blob: 712d69709e05d747025a9de1a11d2fb7fbd34928 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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 */