Charades
processed_queue.h
1 #ifndef PROCESSED_QUEUE
2 #define PROCESSED_QUEUE
3 
4 #include "event.h"
5 #include "typedefs.h"
6 #include "util.h"
7 
9  size_t length;
10  Event *head;
11  Event *tail;
12 
13  Event** temp_event_buffer;
14 
15  public:
16  ProcessedQueue() : length(0), head(NULL), tail(NULL) { }
17  ~ProcessedQueue() {
18  while (length) {
19  Event* e = pop_front();
20  tw_event_free(e,false);
21  }
22  }
23 
24  virtual void pup(PUP::er &p) {
25  p | length;
26 
27  int temp_items = length;
28  if (p.isUnpacking()) {
29  temp_event_buffer = new Event*[temp_items];
30  length = 0;
31  }
32 
33  Event* e = head;
34  for (int i = 0; i < temp_items; i++) {
35  if (p.isUnpacking()) {
36  e = event_alloc();
37  }
38  e->pup(p);
39  if (p.isUnpacking()) {
40  temp_event_buffer[e->index] = e;
41  push_back(e);
42  } else {
43  e->index = i;
44  e = e->next;
45  }
46  }
47  }
48 
49  Event** get_temp_event_buffer() const {
50  return temp_event_buffer;
51  }
52 
53  void delete_temp_event_buffer() {
54  delete[] temp_event_buffer;
55  }
56 
57  size_t size() const {
58  return length;
59  }
60 
61  void push_front(Event *e) {
62  e->state.owner = TW_rollback_q;
63  length++;
64 
65  e->next = head;
66  e->prev = NULL;
67  if(head != NULL) {
68  head->prev = e;
69  }
70  head = e;
71  if(tail == NULL) {
72  tail = e;
73  }
74  }
75 
76  Event * front() const {
77  return head;
78  }
79 
80  Time max() const {
81  return (head ? head->ts : 0);
82  }
83 
84  Event * pop_front() {
85  TW_ASSERT(length > 0, "Popping an empty queue from the front\n");
86 
87  Event *e = head;
88  head = e->next;
89  length--;
90  if(head == NULL) {
91  tail = NULL;
92  } else {
93  head->prev = NULL;
94  }
95  e->state.owner = 0;
96  return e;
97  }
98 
99  void push_back(Event *e) {
100  e->state.owner = TW_rollback_q;
101  length++;
102 
103  e->prev = tail;
104  if(tail != NULL) {
105  tail->next = e;
106  }
107  tail = e;
108  e->next = NULL;
109  if(head == NULL) {
110  head = e;
111  }
112  }
113 
114  Event * back() const {
115  return tail;
116  }
117 
118  Time min() const {
119  return (tail ? tail->ts : TIME_MAX);
120  }
121 
122  Event * pop_back() {
123  TW_ASSERT(length > 0, "Popping an empty queue from the back\n");
124 
125  Event * e = tail;
126  tail = e->prev;
127  length--;
128  if(tail != NULL) {
129  tail->next = NULL;
130  } else {
131  head = NULL;
132  }
133  e->state.owner = 0;
134  return e;
135  }
136 
137  void erase(Event *e) {
138  TW_ASSERT(length > 0, "Attempting to erase from an empty queue\n");
139  TW_ASSERT(e->state.owner == TW_rollback_q, "Erasing event we don't own\n");
140 
141  e->state.owner = 0;
142  length--;
143  if(e->prev != NULL) {
144  e->prev->next = e->next;
145  } else {
146  head = e->next;
147  }
148  if(e->next != NULL) {
149  e->next->prev = e->prev;
150  } else {
151  tail = e->prev;
152  }
153  }
154 };
155 #endif
unsigned char owner
Which queue I am in; see tw_event_owner.
Definition: event.h:64
Definition: event.h:120
Event * event_alloc(RemoteEvent *event, uint64_t dest_gid, Time offset, LPBase *sender)
Send a previously allocated event.
Definition: event.C:47
In the chare&#39;s rollback queue.
Definition: event.h:59
Definition: processed_queue.h:8
Declares most types used within the simulator and by models.