All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
genfifo.h
Go to the documentation of this file.
1 #pragma once
2 
3 #ifdef __linux__
4 
5 #ifndef GENFIFO_NO_LOCK
6 #ifdef WIN32
7 #include <windows.h>
8 #else
9 #include <pthread.h>
10 #endif
11 #endif
12 
13 #include <queue>
14 
15 // GenFifo Class
16 // =============
17 // if iSize == 0 the fifo size is not limited
18 template <class T>
19 class CGenFifo
20 {
21  private:
22  std::queue<T> m_tItemList;
23  unsigned int m_uiMaxItems;
24 #ifndef GENFIFO_NO_LOCK
25 #ifdef WIN32
26  HANDLE m_hMutex;
27 #else
28  pthread_mutex_t m_tMutex;
29 #endif
30 #endif
31 
32  public:
33  CGenFifo()
34  {
35 #ifndef GENFIFO_NO_LOCK
36 #ifdef WIN32
37  m_hMutex = CreateMutex(NULL,FALSE, TEXT("GenFifoMutex"));
38 #else
39  pthread_mutex_init(&m_tMutex, NULL);
40 #endif
41 #endif
42  }
43 
44  // iMaxItems == 0 then fifo size is not limited
45  void SetMaxItems (unsigned int uiMaxItems)
46  {
47  m_uiMaxItems = uiMaxItems;
48  }
49 
50  bool PutItem (T tPutItem)
51  {
52  bool bResult = false;
53 #ifndef GENFIFO_NO_LOCK
54 #ifdef WIN32
55  WaitForSingleObject(m_hMutex,INFINITE);
56 #else
57  pthread_mutex_lock(&m_tMutex);
58 #endif
59 #endif
60  if ( (m_tItemList.size() < m_uiMaxItems) || (m_uiMaxItems == 0) )
61  {
62  m_tItemList.push(tPutItem);
63  bResult = true;;
64  }
65 #ifndef GENFIFO_NO_LOCK
66 #ifdef WIN32
67  ReleaseMutex(m_hMutex);
68 #else
69  pthread_mutex_unlock(&m_tMutex);
70 #endif
71 #endif
72  return bResult;
73  }
74 
75  bool GetItem (T &tGetItem)
76  {
77  bool bResult = false;
78 #ifndef GENFIFO_NO_LOCK
79 #ifdef WIN32
80  WaitForSingleObject(m_hMutex,INFINITE);
81 #else
82  pthread_mutex_lock(&m_tMutex);
83 #endif
84 #endif
85  if (m_tItemList.size() > 0)
86  {
87  tGetItem = m_tItemList.front();
88  m_tItemList.pop();
89  bResult = true;;
90  }
91 #ifndef GENFIFO_NO_LOCK
92 #ifdef WIN32
93  ReleaseMutex(m_hMutex);
94 #else
95  pthread_mutex_unlock(&m_tMutex);
96 #endif
97 #endif
98  return bResult;
99  }
100 
101  void ClearItems (void)
102  {
103 #ifndef GENFIFO_NO_LOCK
104 #ifdef WIN32
105  WaitForSingleObject(m_hMutex,INFINITE);
106 #else
107  pthread_mutex_lock(&m_tMutex);
108 #endif
109 #endif
110  while (m_tItemList.size() > 0)
111  {
112  m_tItemList.pop();
113  }
114 #ifndef GENFIFO_NO_LOCK
115 #ifdef WIN32
116  ReleaseMutex(m_hMutex);
117 #else
118  pthread_mutex_unlock(&m_tMutex);
119 #endif
120 #endif
121  }
122 
123  int ItemCount (void)
124  {
125  int iCount;
126 #ifndef GENFIFO_NO_LOCK
127 #ifdef WIN32
128  WaitForSingleObject(m_hMutex,INFINITE);
129 #else
130  pthread_mutex_lock(&m_tMutex);
131 #endif
132 #endif
133  iCount = m_tItemList.size();
134 #ifndef GENFIFO_NO_LOCK
135 #ifdef WIN32
136  ReleaseMutex(m_hMutex);
137 #else
138  pthread_mutex_unlock(&m_tMutex);
139 #endif
140 #endif
141  return iCount;
142  }
143 
144 };
145 
146 #endif
147