comparison src/synchronizedQueue/synchronizedQueueForCas.c @ 56:4283b87ddbf4

Add stub to synchronizedQueues
author Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
date Tue, 16 Jun 2015 15:59:48 +0900
parents 1b71266af056
children 2a40d697bf4e
comparison
equal deleted inserted replaced
55:2ff693c5563c 56:4283b87ddbf4
29 // context->data[Allocate]->allocate.after_put = Code3; 29 // context->data[Allocate]->allocate.after_put = Code3;
30 // context->data[context->dataNum] -> element.value = 1024; 30 // context->data[context->dataNum] -> element.value = 1024;
31 // goto meta(context, Sender); 31 // goto meta(context, Sender);
32 //} 32 //}
33 33
34 __code code1(struct Context* context) { 34 __code code1(struct Context* context, struct Allocate* allocate) {
35 context->data[Allocate]->allocate.size = sizeof(long); 35 allocate->size = sizeof(long);
36 context->data[Allocate]->allocate.next = Code2; 36 allocate->next = Code2;
37 goto meta(context, Allocator); 37 goto meta(context, Allocator);
38 } 38 }
39 39
40 __code code2(struct Context* context) { 40 __code code1_stub(struct Context* context) {
41 context->data[Counter] -> count = 0; 41 goto code1(context, &context->data[Allocate]->allocate);
42 }
43
44 __code code2(struct Context* context, long* count) {
45 *count = 0;
42 goto meta(context, Code3); 46 goto meta(context, Code3);
43 } 47 }
44 48
45 __code code3(struct Context* context) { 49 __code code2_stub(struct Context* context) {
46 long loop = context->data[Counter]->count; 50 goto code2(context, &context->data[Counter]->count);
51 }
52
53
54 __code code3(struct Context* context, long* count, struct Allocate* allocate) {
55 long loop = *count;
47 if(loop == NUM) { 56 if(loop == NUM) {
48 goto meta(context, ThreadExit); 57 goto meta(context, ThreadExit);
49 } 58 }
50 context->data[Allocate]->allocate.size = sizeof(struct Element); 59 allocate->size = sizeof(struct Element);
51 context->data[Allocate]->allocate.next = Code4; 60 allocate->next = Code4;
52 goto meta(context, Allocator); 61 goto meta(context, Allocator);
53 } 62 }
54 63
55 __code code4(struct Context* context) { 64 __code code3_stub(struct Context* context) {
56 context->data[Allocate]->allocate.after_put = Code3; 65 goto code3(context, &context->data[Counter]->count, &context->data[Allocate]->allocate);
57 context->data[Allocate]->allocate.after_fail = Code3; 66 }
58 context->data[context->dataNum] -> element.value = context->data[Counter]->count++; 67
68 __code code4(struct Context* context, long* count, struct Allocate* allocate, struct Element* element) {
69 allocate->after_put = Code3;
70 allocate->after_fail = Code3;
71 element->value = (*count)++;
59 goto meta(context, Sender); 72 goto meta(context, Sender);
73 }
74
75 __code code4_stub(struct Context* context) {
76 goto code4(context, &context->data[Counter]->count, &context->data[Allocate]->allocate, &context->data[context->dataNum]->element);
60 } 77 }
61 78
62 __code sender(struct Context* context) { 79 __code sender(struct Context* context) {
63 goto meta(context, Put); 80 goto meta(context, Put);
64 } 81 }
65 82
66 __code meta_put(struct Context* context, enum Code next) { 83 __code sender_stub(struct Context* context) {
67 union Data *last_ds, *new_ds; 84 goto sender(context);
68 last_ds = context->data[Queue]->queue.last; 85 }
69 new_ds = context->data[context->dataNum]; 86
70 new_ds->element.next = 0; 87 __code meta_put(struct Context* context, struct Allocate* allocate, struct Queue* queue, struct Element* element, enum Code next) {
88 struct Element *last_ds, *new_ds;
89 last_ds = queue->last;
90 new_ds = element;
91 new_ds->next = 0;
71 int count = 0; 92 int count = 0;
72 while(!__sync_bool_compare_and_swap(&context->data[Queue]->queue.last, last_ds, new_ds)) { 93 while(!__sync_bool_compare_and_swap(&queue->last, last_ds, new_ds)) {
73 if(count < 1000) { 94 if(count < 1000) {
74 last_ds = context->data[Queue]->queue.last; 95 last_ds = queue->last;
75 new_ds = context->data[context->dataNum]; 96 new_ds = element;
76 new_ds->element.next = 0; 97 new_ds->next = 0;
77 count++; 98 count++;
78 } else { 99 } else {
79 // error handle 100 // error handle
80 goto meta(context, context->data[Allocate]->allocate.after_fail); 101 goto meta(context, context->data[Allocate]->allocate.after_fail);
81 } 102 }
82 } 103 }
83 104
84 if(context->data[Queue]->queue.first) { 105 if(queue->first) {
85 last_ds->element.next = new_ds; 106 last_ds->next = new_ds;
86 } else { 107 } else {
87 context->data[Queue]->queue.first = new_ds; 108 queue->first = new_ds;
88 } 109 }
89 printf("Put %d\n\n", context->data[Queue]->queue.last->element.value); 110 printf("Put %d\n\n", queue->last->value);
90 context->data[Queue]->queue.count++; 111 queue->count++;
91 goto (context->code[next])(context); 112 goto (context->code[next])(context);
92 } 113 }
93 114
94 __code put(struct Context* context) { 115 __code put(struct Context* context, struct Allocate* allocate, struct Queue* queue, struct Element* element) {
95 goto meta_put(context, context->data[Allocate]->allocate.after_put); 116 goto meta_put(context, allocate, queue, element, allocate->after_put);
96 } 117 }
97 118
98 __code code5(struct Context* context) { 119 __code put_stub(struct Context* context) {
99 context->data[Allocate]->allocate.size = sizeof(long); 120 goto put(context, &context->data[Allocate]->allocate, &context->data[Queue]->queue, &context->data[context->dataNum]->element);
100 context->data[Allocate]->allocate.next = Code6; 121 }
122
123 __code code5(struct Context* context, struct Allocate* allocate) {
124 allocate->size = sizeof(long);
125 allocate->next = Code6;
101 goto meta(context, Allocator); 126 goto meta(context, Allocator);
102 } 127 }
103 128
104 __code code6(struct Context* context) { 129 __code code5_stub(struct Context* context) {
105 context->data[Counter] -> count = 0; 130 goto code5(context, &context->data[Allocate]->allocate);
131 }
132
133 __code code6(struct Context* context, long* count) {
134 *count = 0;
106 goto meta(context, Code7); 135 goto meta(context, Code7);
107 } 136 }
108 137
109 __code code7(struct Context* context) { 138 __code code6_stub(struct Context* context) {
110 long loop = context->data[Counter]->count; 139 goto code6(context, &context->data[Counter]->count);
140 }
141
142 __code code7(struct Context* context, long* count, struct Allocate* allocate) {
143 long loop = *count;
111 if(loop == NUM) { 144 if(loop == NUM) {
112 goto meta(context, ThreadExit); 145 goto meta(context, ThreadExit);
113 } 146 }
114 context->data[Counter]->count++; 147 (*count)++;
115 context->data[Allocate]->allocate.after_get = Code7; 148 allocate->after_get = Code7;
116 context->data[Allocate]->allocate.after_fail = Code7; 149 allocate->after_fail = Code7;
117 goto meta(context, Receiver); 150 goto meta(context, Receiver);
151 }
152
153 __code code7_stub(struct Context* context) {
154 goto code7(context, &context->data[Counter]->count, &context->data[Allocate]->allocate);
118 } 155 }
119 156
120 __code receiver(struct Context* context) { 157 __code receiver(struct Context* context) {
121 goto meta(context, Get); 158 goto meta(context, Get);
122 } 159 }
123 160
124 __code meta_get(struct Context* context, enum Code next) { 161 __code receiver_stub(struct Context* context) {
125 union Data *first_ds, *new_ds; 162 goto receiver(context);
126 first_ds = context->data[Queue]->queue.first; 163 }
127 new_ds = first_ds? first_ds->element.next : 0; 164
165 __code meta_get(struct Context* context, struct Allocate* allocate, struct Queue* queue, struct Element* element, enum Code next) {
166 struct Element *first_ds, *new_ds;
167 first_ds = queue->first;
168 new_ds = first_ds? first_ds->next : 0;
128 int count = 0; 169 int count = 0;
129 while(!__sync_bool_compare_and_swap(&context->data[Queue]->queue.first, first_ds, new_ds)) { 170 while(!__sync_bool_compare_and_swap(&queue->first, first_ds, new_ds)) {
130 if(count < 1000) { 171 if(count < 1000) {
131 first_ds = context->data[Queue]->queue.first; 172 first_ds = queue->first;
132 new_ds = first_ds? first_ds->element.next : 0; 173 new_ds = first_ds? first_ds->next : 0;
133 count++; 174 count++;
134 } else { 175 } else {
135 // error handle 176 // error handle
136 goto meta(context, context->data[Allocate]->allocate.after_fail); 177 goto meta(context, context->data[Allocate]->allocate.after_fail);
137 } 178 }
140 // success CAS 181 // success CAS
141 if (first_ds == new_ds) { 182 if (first_ds == new_ds) {
142 printf("queue is empty\n"); 183 printf("queue is empty\n");
143 goto meta(context, Get); 184 goto meta(context, Get);
144 } else { 185 } else {
145 printf(" Get %d\n\n", first_ds->element.value); 186 printf(" Get %d\n\n", first_ds->value);
146 context->data[Queue]->queue.count--; 187 queue->count--;
147 goto (context->code[next])(context); 188 goto (context->code[next])(context);
148 } 189 }
149 } 190 }
150 191
151 __code get(struct Context* context) { 192 __code get(struct Context* context, struct Allocate* allocate, struct Queue* queue, struct Element* element) {
152 goto meta_get(context, context->data[Allocate]->allocate.after_get); 193 goto meta_get(context, allocate, queue, element, allocate->after_get);
194 }
195
196 __code get_stub(struct Context* context) {
197 goto get(context, &context->data[Allocate]->allocate, &context->data[Queue]->queue, &context->data[context->dataNum]->element);
153 } 198 }
154 199
155 __code thread_exit(struct Context* context) { 200 __code thread_exit(struct Context* context) {
156 free(context->code); 201 free(context->code);
157 free(context->data); 202 free(context->data);
158 free(context->heap_start); 203 free(context->heap_start);
159 pthread_exit(0); 204 pthread_exit(0);
205 }
206
207 __code thread_exit_stub(struct Context* context) {
208 goto thread_exit(context);
160 } 209 }
161 210
162 void* thread_func(void* context) { 211 void* thread_func(void* context) {
163 goto start_code((struct Context*)context, Code1); 212 goto start_code((struct Context*)context, Code1);
164 return 0; 213 return 0;