Mercurial > hg > Members > innparusu > Gears
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; |