Mercurial > hg > Members > Moririn
diff src/synchronizedQueue/synchronizedQueue.c @ 36:240c045ebab2
Add normal queue
author | Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 15 May 2015 19:17:23 +0900 |
parents | 604135010c3a |
children | ce9fde200f3e |
line wrap: on
line diff
--- a/src/synchronizedQueue/synchronizedQueue.c Tue May 05 21:16:04 2015 +0900 +++ b/src/synchronizedQueue/synchronizedQueue.c Fri May 15 19:17:23 2015 +0900 @@ -1,21 +1,15 @@ +#include <stdlib.h> +#include <stdio.h> + #include "synchronizedQueueContext.h" +#include "allocate.h" #include "origin_cs.h" -#ifdef CLANG -#define _CbC_retrun __return -#define _CbC_environment __environment -#endif - -#define NUM 100 -#define ALLOCATE_SIZE 1000000000 - extern __code initSynchronizedQueueContext(struct Context* context); -static int num; - __code code1(struct Context* context) { - context->data[Allocate]->allocate.size = sizeof(long); + context->data[Allocate]->allocate.size = sizeof(struct Element); context->data[Allocate]->allocate.next = Code2; goto meta(context, Allocator); } @@ -24,63 +18,85 @@ goto (context->code[next])(context); } +__code meta_code2(struct Context* context, enum Code next) { + context->data[Queue]->queue.head = context->data[context->dataNum]; + context->data[Queue]->queue.tail = context->data[Queue]->queue.head; + context->data[context->dataNum]->element.next = 0; + goto (context->code[next])(context); +} + __code code2(struct Context* context) { - context->data[1]->count = 0; - goto meta(context, Code3); + context->data[context->dataNum] -> element.value = 1024; + context->data[Allocate]->allocate.size = sizeof(struct Element); + context->data[Allocate]->allocate.next = Code3; + goto meta_code2(context, Allocator); } __code code3(struct Context* context) { - struct Allocate* allocate = &context->data[Allocate]->allocate; - long loop = context->data[1]->count; - if (loop == num) { - goto meta(context, Code4); - } - allocate->size = sizeof(struct Node); - allocate->after_put = Code3; + context->data[Allocate]->allocate.after_put = Code4; + context->data[context->dataNum] -> element.value = 10; + goto meta(context, Put); +} - context->data[1]->count++; - goto meta(context, Put); +__code meta_put(struct Context* context, enum Code next) { + context->data[Queue]->queue.tail->element.next = context->data[context->dataNum]; + context->data[Queue]->queue.tail = context->data[Queue]->queue.tail->element.next; + context->data[Queue]->queue.tail->element.next = 0; + goto (context->code[next])(context); +} + +__code put(struct Context* context) { + goto meta_put(context, context->data[Allocate]->allocate.after_put); } -__code put(struct Context* context) { - struct Allocate* allocate = &context->data[Allocate]->allocate; - - // sem_p - pthread_mutext_lock(&allocate->queue_remain->mutex); - while(sem->value == 0) { - pthread_cond_wait(&allocate->queue_remain->cond, &allocate->queue_remain->mutex); +__code meta_traverse(struct Context* context, enum Code next) { + printf("current value in queue is %d\n", context->data[Queue]->queue.current->element.value); + if (context->data[Queue]->queue.current->element.next) { + context->data[Queue]->queue.current = context->data[Queue]->queue.current->element.next; + goto meta_traverse(context, next); } - allocate->queue_remain->value--; - pthread_mutext_unlock(&allocate->queue_remain->mutex); - - struct ListContext* list_context = context->data[Allocate]-> list_context; - list_context->data[Allocate]->value = context->data[1]->count; + goto (context->code[next])(context); +} - // sem_v - pthread_mutext_lock(&allocate->queue_count->mutex); - allocate->queue_count->value++; - pthare_cond_signal(&allocate->queue_count->cond); - pthread_mutext_unlock(&allocate->queue_count->mutex); +__code traverse(struct Context* context) { + context->data[Queue]->queue.current = context->data[Queue]->queue.head; + goto meta_traverse(context, context->data[Allocate]->allocate.after_traverse); +} - goto metaPut(context, ); +__code code4(struct Context* context) { + context->data[Allocate]->allocate.after_traverse = Code5; + goto meta(context, Traverse); } -__code metaPut(struct Context* context, enum Code next){ -} -__code take(struct Context* context) { +__code code5(struct Context* context) { + context->data[Allocate]->allocate.after_get = Code6; + goto meta(context, Get); } -__code cas(struct Context* context, enum Code next) { +__code meta_get(struct Context* context, enum Code next) { + if (context->data[Queue]->queue.head == context->data[Queue]->queue.tail) { + printf("queue is empty\n"); + goto (context->code[Exit])(context); + } + context->data[Queue]->queue.head = (context->data[Queue]->queue.head->element.next) ? context->data[Queue]->queue.head->element.next : 0; + goto (context->code[next])(context); } -int main(int argc, char const* argv[]) { - num = (int)atoi(argv[1]); - struct Context* context = (struct Context*)malloc(sizeof(struct Context); - context->code = malloc(sizeof(__code*)*ALLOCATE_SIZE); - context->data = malloc(sizeof(union Data**)*ALLOCATE_SIZE); - context->heap = malloc(sizeof(union Data*)*ALLOCATE_SIZE); +__code get(struct Context* context) { + goto meta_get(context, context->data[Allocate]->allocate.after_get); +} + +__code code6(struct Context* context) { + printf("after delete\n"); + context->data[Allocate]->allocate.after_traverse = Exit; + goto meta(context, Traverse); +} + + +int main() { + struct Context* context = (struct Context*)malloc(sizeof(struct Context)); initSynchronizedQueueContext(context); goto start_code(context, Code1); }