10 #define _PENDING_HEAP_ 12 #include "pending_queue.h" 20 #define HEAP_INCREMENT 128 22 #define LEFT(i) (2*i+1) 23 #define RIGHT(i) (2*i+2) 24 #define PARENT(i) (((i-1)/2)) 26 #define SWAP(x,y,t) { \ 28 elems[x] = elems[y]; \ 30 elems[x]->index = x; \ 31 elems[y]->index = y; \ 41 void sift_down(
int i) {
42 if (nelems <= 1)
return;
44 size_t parent, left, right, temp_idx = i;
51 right = RIGHT(parent);
52 if (left < nelems && comparator(elems[left], elems[temp_idx])) temp_idx = left;
53 if (right < nelems && comparator(elems[right], elems[temp_idx])) temp_idx = right;
54 if (parent != temp_idx) SWAP(parent, temp_idx, temp);
55 }
while (parent != temp_idx);
58 void percolate_up(
int i ) {
59 if (nelems <= 1)
return;
61 int child, parent, temp_idx = i;
67 parent = PARENT(child);
68 if (parent >= 0 && comparator(elems[temp_idx], elems[parent])) temp_idx = parent;
69 if (child != temp_idx) SWAP(child, temp_idx, temp);
70 }
while (child != temp_idx);
75 int init_size = HEAP_INCREMENT;
77 curr_max = (2*init_size);
78 int err = posix_memalign((
void**)&elems, 64,
sizeof(
Event*)*curr_max);
79 memset(elems, 0,
sizeof(
Event*) * curr_max);
84 curr_max = (2*init_size);
85 int err = posix_memalign((
void**)&elems, 64,
sizeof(
Event*)*curr_max);
86 memset(elems, 0,
sizeof(
Event**) * curr_max);
90 for (
int i = 0; i < nelems; i++) {
91 tw_event_free(elems[i],
false);
96 virtual void pup(PUP::er& p) {
99 if (p.isUnpacking()) {
100 int err = posix_memalign((
void**)&elems, 64,
sizeof(
Event*)*curr_max);
101 memset(elems, 0,
sizeof(
Event**) * curr_max);
103 for (
int i = 0; i < nelems; i++) {
104 if (p.isUnpacking()) {
111 Event** get_temp_event_buffer() {
115 void delete_temp_event_buffer() {
119 return (nelems <= 0) ? TIME_MAX : elems[0]->ts;
122 size_t size()
const {
126 void push(
Event* e) {
127 if (nelems >= curr_max) {
128 size_t old_max = curr_max;
129 curr_max += HEAP_INCREMENT;
131 int err = posix_memalign((
void**)&elems, 64,
sizeof(
Event**)*curr_max);
132 memcpy(elems, old,
sizeof(
Event**) * old_max);
133 memset(&elems[old_max], 0,
sizeof(
Event**) * HEAP_INCREMENT);
141 percolate_up(nelems-1);
152 elems[0] = elems[nelems];
154 elems[nelems] = NULL;
161 void erase(
Event* victim) {
162 TW_ASSERT(nelems > 0,
"Can't erase from an empty heap\n");
163 TW_ASSERT(victim->index >= 0 && victim->index < nelems,
164 "Invalid heap index in erase\n");
165 TW_ASSERT(elems[victim->index]->index == victim->index,
166 "Mismatch in heap indices during erase\n");
168 int i = victim->index;
172 elems[nelems] = NULL;
174 }
else if (nelems > 0) {
175 elems[i] = elems[nelems];
177 elems[nelems] = NULL;
179 if (elems[i]->ts <= victim->ts) {
unsigned char owner
Which queue I am in; see tw_event_owner.
Definition: event.h:64
Definition: pending_queue.h:3
Definition: pending_heap.h:34
Event * event_alloc(RemoteEvent *event, uint64_t dest_gid, Time offset, LPBase *sender)
Send a previously allocated event.
Definition: event.C:47
Declares most types used within the simulator and by models.
In the chare's pending queue.
Definition: event.h:58