111
|
1 #include "context.h"
|
|
2 #include "origin_cs.h"
|
|
3
|
|
4 __code meta_waitFor(struct Context* context, struct Queue* queue, enum Code next) {
|
|
5 context->data[Queue] = (Data *)queue;
|
|
6 goto (context->code[next])(context);
|
|
7 }
|
|
8
|
|
9 __code waitFor1(struct Context* context, struct Task* master, struct Task* slave, struct Element* element) {
|
|
10 element->task = slave;
|
|
11 task->next = WaitFor2;
|
|
12 // enqueue waitMe
|
|
13 goto meta_waitFor(context, task->waitMe, PutQueue1);
|
|
14 }
|
|
15
|
|
16 __code waitFor1_stub(struct Context* context) {
|
|
17 // next think
|
|
18 }
|
|
19
|
|
20 __code waitFor2(struct Context* context, struct Task* master, struct Task* slave, struct Element* element) {
|
|
21 element->task = master;
|
|
22 task->next = context->next;
|
|
23 // enqueue waitI
|
|
24 goto meta_waitFor(context, task->waitI, PutQueue1);
|
|
25 }
|
|
26
|
|
27 __code waitFor2_stub(struct Context* context) {
|
|
28 // next think
|
|
29 }
|
|
30
|
|
31 __code spawnTask(struct Context* context, struct Task* task, struct Queue* activeQueue, struct Queue* waitQueue) {
|
|
32 if (task->wait_i->count == task->wait_task_count) {
|
|
33 element->task = task;
|
|
34 // enqueue activeQueue
|
|
35 goto meta(context, PutQueue1);
|
|
36 }
|
|
37 else {
|
|
38 element->task = task;
|
|
39 // enqueue waitQueue
|
|
40 goto meta(context, PutQueue1);
|
|
41 }
|
|
42 }
|
|
43
|
|
44 __code spawnTask_stub(struct Context* context) {
|
|
45 // next think
|
|
46 }
|
|
47
|
|
48 __code taskA(struct Context*) {
|
|
49 printf("TaskA\n");
|
|
50 goto meta(context, context->next);
|
|
51 }
|
|
52
|
|
53 __code taskB(struct Context*) {
|
|
54 printf("TaskB\n");
|
|
55 goto meta(context, context->next);
|
|
56 }
|
|
57
|
|
58 __code taskC(struct Context*) {
|
|
59 printf("TaskC\n");
|
|
60 goto meta(context, context->next);
|
|
61 }
|