Mercurial > hg > Members > innparusu > Gears
view src/synchronizedQueue/synchronizedQueue.c @ 38:ce9fde200f3e
Add code segment sender & receiver to synchronizedQueue
author | Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 16 May 2015 02:45:31 +0900 |
parents | 240c045ebab2 |
children | 754c90e96e3d |
line wrap: on
line source
#include <stdlib.h> #include <stdio.h> #include "synchronizedQueueContext.h" #include "allocate.h" #include "origin_cs.h" extern __code initSynchronizedQueueContext(struct Context* context); __code code1(struct Context* context) { context->data[Allocate]->allocate.size = sizeof(struct Element); context->data[Allocate]->allocate.next = Code2; goto meta(context, Allocator); } __code meta(struct Context* context, enum Code next) { goto (context->code[next])(context); } __code code2(struct Context* context) { context->data[Allocate]->allocate.after_put = Code3; context->data[context->dataNum] -> element.value = 1024; goto meta(context, Sender); } __code meta_sender(struct Context* context, enum Code next) { goto (context->code[next])(context); } __code sender(struct Context* context) { goto meta(context, Put); } __code code3(struct Context* context) { context->data[Allocate]->allocate.size = sizeof(struct Element); context->data[Allocate]->allocate.next = Code4; goto meta(context, Allocator); } __code code4(struct Context* context) { context->data[Allocate]->allocate.after_put = Code5; context->data[context->dataNum] -> element.value = 10; goto meta(context, Sender); } __code meta_put(struct Context* context, enum Code next) { if(context->data[Queue]->queue.first) { context->data[Queue]->queue.last->element.next = context->data[context->dataNum]; context->data[Queue]->queue.last = context->data[Queue]->queue.last->element.next; } else { context->data[Queue]->queue.first = context->data[context->dataNum]; context->data[Queue]->queue.last = context->data[Queue]->queue.first; } context->data[Queue]->queue.last->element.next = 0; goto (context->code[next])(context); } __code put(struct Context* context) { goto meta_put(context, context->data[Allocate]->allocate.after_put); } __code code5(struct Context* context) { context->data[Allocate]->allocate.after_get = Code6; goto meta(context, Receiver); } __code meta_receiver(struct Context* context, enum Code next) { } __code receiver(struct Context* context, enum Code next) { goto meta(context, Get); } __code meta_get(struct Context* context, enum Code next) { if (context->data[Queue]->queue.first == context->data[Queue]->queue.last) { printf("queue is empty\n"); goto (context->code[Exit])(context); } printf("Get %d\n", context->data[Queue]->queue.first->element.value); context->data[Queue]->queue.first = (context->data[Queue]->queue.first->element.next) ? context->data[Queue]->queue.first->element.next : 0; goto (context->code[next])(context); } __code get(struct Context* context) { goto meta_get(context, context->data[Allocate]->allocate.after_get); } __code code6(struct Context* context) { goto meta(context, Exit); } int main() { struct Context* context1 = (struct Context*)malloc(sizeof(struct Context)); initSynchronizedQueueContext(context1); struct Context* context2 = (struct Context*)malloc(sizeof(struct Context)); initSynchronizedQueueContext(context2); context2->data[Queue] = context1->data[Queue]; goto start_code(context1, Code1); }