SST  7.0.0
StructuralSimulationToolkit
circularBuffer.h
1 
2 #ifndef SST_CORE_INTERPROCESS_CIRCULARBUFFER_H
3 #define SST_CORE_INTERPROCESS_CIRCULARBUFFER_H
4 
5 #include "sstmutex.h"
6 
7 namespace SST {
8 namespace Core {
9 namespace Interprocess {
10 
11 template <typename T>
13 
14 public:
15  CircularBuffer(size_t mSize = 0) {
16  buffSize = mSize;
17  readIndex = 0;
18  writeIndex = 0;
19  }
20 
21  void setBufferSize(const size_t bufferSize)
22  {
23  if ( buffSize != 0 ) {
24  fprintf(stderr, "Already specified size for buffer\n");
25  exit(1);
26  }
27 
28  buffSize = bufferSize;
29  __sync_synchronize();
30  }
31 
32  T read() {
33  int loop_counter = 0;
34 
35  while( true ) {
36  bufferMutex.lock();
37 
38  if( readIndex != writeIndex ) {
39  const T result = buffer[readIndex];
40  readIndex = (readIndex + 1) % buffSize;
41 
42  bufferMutex.unlock();
43  return result;
44  }
45 
46  bufferMutex.unlock();
47  bufferMutex.processorPause(loop_counter++);
48  }
49  }
50 
51  bool readNB(T* result) {
52  if( bufferMutex.try_lock() ) {
53  if( readIndex != writeIndex ) {
54  *result = buffer[readIndex];
55  readIndex = (readIndex + 1) % buffSize;
56 
57  bufferMutex.unlock();
58  return true;
59  }
60 
61  bufferMutex.unlock();
62  }
63 
64  return false;
65  }
66 
67  void write(const T& v) {
68  int loop_counter = 0;
69 
70  while( true ) {
71  bufferMutex.lock();
72 
73  if( ((writeIndex + 1) % buffSize) != readIndex ) {
74  buffer[writeIndex] = v;
75  writeIndex = (writeIndex + 1) % buffSize;
76 
77  __sync_synchronize();
78  bufferMutex.unlock();
79  return;
80  }
81 
82  bufferMutex.unlock();
83  bufferMutex.processorPause(loop_counter++);
84  }
85  }
86 
87  ~CircularBuffer() {
88 
89  }
90 
91  void clearBuffer() {
92  bufferMutex.lock();
93  readIndex = writeIndex;
94  __sync_synchronize();
95  bufferMutex.unlock();
96  }
97 
98 private:
99  SSTMutex bufferMutex;
100  size_t buffSize;
101  size_t readIndex;
102  size_t writeIndex;
103  T buffer[0];
104 
105 };
106 
107 }
108 }
109 }
110 
111 #endif
Definition: action.cc:17
Definition: circularBuffer.h:12
Definition: sstmutex.h:16