Mercurial > hg > Papers > 2022 > ikki-master
annotate Paper/src/SynchronizedQueue.c @ 6:38dfa4d8b0be
add GearsFile & Directory
author | ichikitakahiro <e165713@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 16 Jan 2022 23:43:50 +0900 |
parents | e655f81a0c76 |
children |
rev | line source |
---|---|
3
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 #include "../context.h" |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 // include "Queue.h" |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 // include "Atomic.h" |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 #include <stdio.h> |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 Queue* createSynchronizedQueue(struct Context* context) { |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 struct Queue* queue = &ALLOCATE(context, Queue)->Queue; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 struct SynchronizedQueue* synchronizedQueue = &ALLOCATE(context, SynchronizedQueue)->SynchronizedQueue; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10 synchronizedQueue->top = &ALLOCATE(context, Element)->Element; // allocate a free node |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 synchronizedQueue->top->next = NULL; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12 synchronizedQueue->last = synchronizedQueue->top; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
13 synchronizedQueue->atomic = createAtomicReference(context); // not used |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
14 queue->queue = (union Data*)synchronizedQueue; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
15 queue->take = C_takeSynchronizedQueue; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16 queue->put = C_putSynchronizedQueue; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 queue->isEmpty = C_isEmptySynchronizedQueue; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
18 queue->clear = C_clearSynchronizedQueue; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19 return queue; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20 } |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
21 |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
22 |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 __code putSynchronizedQueue(struct Context *context,struct SynchronizedQueue* queue, union Data* data, enum Code next) { |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 Element* element = &ALLOCATE(context, Element)->Element; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25 element->data = data; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 element->next = NULL; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27 Element* last = queue->last; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28 Element* nextElement = last->next; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29 if (last != queue->last) { |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
30 goto meta(context, C_putSynchronizedQueue); |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
31 } |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
32 if (nextElement == NULL) { |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
33 struct Atomic* atomic = queue->atomic; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
34 Gearef(context, Atomic)->atomic = (union Data*) atomic; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
35 Gearef(context, Atomic)->ptr = (union Data**) &last->next; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
36 Gearef(context, Atomic)->oldData = (union Data*) nextElement; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
37 Gearef(context, Atomic)->newData = (union Data*) element; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
38 Gearef(context, Atomic)->next = next; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
39 Gearef(context, Atomic)->fail = C_putSynchronizedQueue; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 goto meta(context, atomic->checkAndSet); |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
41 } else { |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
42 struct Atomic* atomic = queue->atomic; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
43 Gearef(context, Atomic)->atomic = (union Data*) atomic; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
44 Gearef(context, Atomic)->ptr = (union Data**) &queue->last; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
45 Gearef(context, Atomic)->oldData = (union Data*) last; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
46 Gearef(context, Atomic)->newData = (union Data*) nextElement; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
47 Gearef(context, Atomic)->next = C_putSynchronizedQueue; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
48 Gearef(context, Atomic)->fail = C_putSynchronizedQueue; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
49 goto meta(context, atomic->checkAndSet); |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
50 } |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
51 } |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
52 |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
53 __code putSynchronizedQueue_stub(struct Context* context) { |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
54 SynchronizedQueue* queue = (SynchronizedQueue*)GearImpl(context, Queue, queue); |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
55 Data* data = Gearef(context, Queue)->data; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
56 enum Code next = Gearef(context, Queue)->next; |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
57 goto putSynchronizedQueue(context, queue, data, next); |
e655f81a0c76
add about meta-level programing
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
58 } |