Charades
event_buffer.h
1 #ifndef EVENT_BUFFER_H
2 #define EVENT_BUFFER_H
3 
4 #include "event.h"
5 #include "statistics.h"
6 #include "util.h"
7 
8 class EventBuffer {
9  private:
10  uint32_t max_events;
11  uint32_t stack_pointer;
12 
13  Event* abort_event;
14  Event** buffer;
15  public:
16  EventBuffer(unsigned max) : max_events(max), stack_pointer(max) {
17  abort_event = new Event();
18  //abort_event->eventMsg = new (msg_size) RemoteEvent;
19  int err = posix_memalign((void **)&buffer, 64, max*sizeof(Event*));
20 
21  // Calculate the buffer size per event to be a multiple of 8 bytes, large
22  // enough to hold an event.
23  char *temp_buf;
24  int buf_size = 8 * (((sizeof(Event) - 1) / 8) + 1);
25  err = posix_memalign((void **)&temp_buf, 64, stack_pointer*buf_size);
26 
27  if (buf_size < sizeof(Event)) {
28  CkAbort("ERROR: Per-event buffer size broken\n");
29  }
30 
31  for (int i = 0; i < max; i++) {
32  buffer[i] = (Event*)temp_buf;
33  temp_buf += buf_size;
34  }
35  }
36 
37  Event* get_abort_event() const {
38  return abort_event;
39  }
40 
41  Event* get_event() {
42  TW_ASSERT(stack_pointer > 0, "Out of events to allocate!\n");
43  buffer[--stack_pointer]->clear();
44  if(max_events - stack_pointer > PE_STATS(max_events_used)) {
45  PE_STATS(max_events_used) = max_events - stack_pointer;
46  }
47  return buffer[stack_pointer];
48  }
49  void free_event(Event* e) {
50  TW_ASSERT(stack_pointer < max_events, "Freeing event to full buffer\n");
51  buffer[stack_pointer++] = e;
52  }
53 
54  unsigned current_size() const {
55  return stack_pointer;
56  }
57 
58  unsigned max_size() const {
59  return max_events;
60  }
61 
62  double percent_used() const {
63  return ((double)stack_pointer / max_events);
64  }
65 };
66 
67 #endif
Definition: event.h:120
Declaration of the Statistics class and associated methods/variables.
Definition: event_buffer.h:8
#define PE_STATS(x)
MACRO to more easily access PE local statistics.
Definition: statistics.h:38