All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
MPMCQueueImpl.h
1 // Copyright (c) 2014 eeGeo. All rights reserved.
2 
3 #pragma once
4 
5 #include "MPMCQueue.h"
6 
7 namespace Eegeo
8 {
9  namespace Concurrency
10  {
11  template <typename T>
12  MPMCQueue<T>::MPMCQueue()
13  {
14  pthread_mutex_init(&m_mutex, 0);
15  }
16 
17  template <typename T>
18  MPMCQueue<T>::~MPMCQueue()
19  {
20  pthread_mutex_destroy(&m_mutex);
21  }
22 
23  template <typename T>
24  size_t MPMCQueue<T>::Size() const
25  {
26  size_t size = 0;
27  pthread_mutex_lock(&m_mutex);
28  size = m_queue.size();
29  pthread_mutex_unlock(&m_mutex);
30  return size;
31  }
32 
33  template <typename T>
34  void MPMCQueue<T>::Enqueue(T message)
35  {
36  pthread_mutex_lock(&m_mutex);
37  m_queue.push_back(message);
38  pthread_mutex_unlock(&m_mutex);
39  m_signal.Signal();
40  }
41 
42  template <typename T>
43  void MPMCQueue<T>::EnqueueHead(T message)
44  {
45  pthread_mutex_lock(&m_mutex);
46  m_queue.push_front(message);
47  pthread_mutex_unlock(&m_mutex);
48  m_signal.Signal();
49  }
50 
51  template <typename T>
52  T MPMCQueue<T>::Dequeue()
53  {
54  m_signal.Wait();
55  return DequeueMessageFromHead();
56  }
57 
58  template <typename T>
59  bool MPMCQueue<T>::TryDequeue(T& message)
60  {
61  if (m_signal.TryWait())
62  {
63  message = DequeueMessageFromHead();
64  return true;
65  }
66  return false;
67  }
68 
69  template <typename T>
70  T MPMCQueue<T>::DequeueMessageFromHead()
71  {
72  pthread_mutex_lock(&m_mutex);
73  Eegeo_ASSERT(m_queue.size() > 0, "No message to deqeue");
74  T message = m_queue.front();
75  m_queue.pop_front();
76  pthread_mutex_unlock(&m_mutex);
77  return message;
78  }
79  }
80 }