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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }