112
|
1 #include <stdio.h>
|
111
|
2 #include "context.h"
|
|
3 #include "origin_cs.h"
|
|
4
|
|
5 __code meta_waitFor(struct Context* context, struct Queue* queue, enum Code next) {
|
112
|
6 context->data[Queue] = (union Data *)queue;
|
111
|
7 goto (context->code[next])(context);
|
|
8 }
|
|
9
|
|
10 __code waitFor1(struct Context* context, struct Task* master, struct Task* slave, struct Element* element) {
|
|
11 element->task = slave;
|
|
12 // enqueue waitMe
|
112
|
13 goto meta_waitFor(context, master->waitMe, PutQueue1);
|
111
|
14 }
|
|
15
|
|
16 __code waitFor1_stub(struct Context* context) {
|
|
17 // next think
|
|
18 }
|
|
19
|
112
|
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 //}
|
111
|
30
|
112
|
31 __code meta_spawnTask(struct Context* context, struct Queue* queue, enum Code next) {
|
|
32 context->data[Queue] = (union Data *)queue;
|
|
33 goto (context->code[next])(context);
|
111
|
34 }
|
|
35
|
112
|
36 __code spawnTask(struct Context* context, struct Task* task, struct Element* element, struct Queue* activeQueue, struct Queue* waitQueue) {
|
|
37 //printf("spawn Task\n");
|
|
38 if (task->waitI->count == task->idsCount) {
|
|
39 //printf("put ActiveQueue\n");
|
111
|
40 element->task = task;
|
|
41 // enqueue activeQueue
|
112
|
42 goto meta_spawnTask(context, activeQueue, PutQueue1);
|
111
|
43 }
|
|
44 else {
|
112
|
45 //printf("put WaitQueue\n");
|
111
|
46 element->task = task;
|
|
47 // enqueue waitQueue
|
112
|
48 goto meta_spawnTask(context, waitQueue, PutQueue1);
|
111
|
49 }
|
|
50 }
|
|
51
|
|
52 __code spawnTask_stub(struct Context* context) {
|
112
|
53 goto spawnTask(context,
|
|
54 &context->data[context->dataNum-2]->task,
|
|
55 &context->data[Element]->element,
|
|
56 &context->data[ActiveQueue]->queue,
|
|
57 &context->data[WaitQueue]->queue);
|
111
|
58 }
|
|
59
|
112
|
60 __code taskA(struct Context* context) {
|
111
|
61 printf("TaskA\n");
|
|
62 goto meta(context, context->next);
|
|
63 }
|
|
64
|
112
|
65 __code taskB(struct Context* context) {
|
111
|
66 printf("TaskB\n");
|
|
67 goto meta(context, context->next);
|
|
68 }
|
|
69
|
112
|
70 __code taskC(struct Context* context) {
|
111
|
71 printf("TaskC\n");
|
|
72 goto meta(context, context->next);
|
|
73 }
|