Mercurial > hg > Members > Moririn
view src/parallel_execution/examples/boundedBuffer/BoundedBuffer.cbc @ 495:2e7ea81e5943
Work BoundedBuffer if singlethread
author | Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 31 Dec 2017 04:36:20 +0900 |
parents | d8b2036c6942 |
children | a7127917c736 |
line wrap: on
line source
#include "../../../context.h" #interface "Buffer.h" #interface "Semaphore.h" Buffer* createBoundedBuffer(struct Context* context, int size) { struct Buffer* buffer = new Buffer(); struct BoundedBuffer* boundedBuffer = new BoundedBuffer(); boundedBuffer->top = new Element(); boundedBuffer->top->next = NULL; boundedBuffer->last = boundedBuffer->top; boundedBuffer->fullCount = createSemaphoreImpl(context, 0); boundedBuffer->emptyCount = createSemaphoreImpl(context, size); boundedBuffer->lock = createSemaphoreImpl(context, 1); // binary semaphore buffer->buffer = (union Data*)boundedBuffer; buffer->take = C_takeBoundedBuffer; buffer->put = C_putBoundedBuffer; return buffer; } __code putBoundedBuffer(struct BoundedBuffer* buffer, union Data* data, __code next(...)) { struct Semaphore* sem = buffer->emptyCount; goto sem->p(putBoundedBuffer1); } __code putBoundedBuffer1(struct BoundedBuffer* buffer, union Data* data, __code next(...)) { struct Semaphore* sem = buffer->lock; goto sem->p(putBoundedBuffer2); } __code putBoundedBuffer2(struct BoundedBuffer* buffer, union Data* data, __code next(...)) { struct Element* element = new Element(); element->data = data; element->next = NULL; struct Element* last = buffer->last; last->next = element; buffer->last = element; struct Semaphore* sem = buffer->lock; goto sem->v(putBoundedBuffer3); } __code putBoundedBuffer3(struct BoundedBuffer* buffer, union Data* data, __code next(...)) { struct Semaphore* sem = buffer->fullCount; goto sem->v(putBoundedBuffer4); } __code putBoundedBuffer4(struct BoundedBuffer* buffer, union Data* data, __code next(...)) { goto next(...); } __code takeBoundedBuffer(struct BoundedBuffer* buffer, __code next(union Data* data, ...)) { struct Semaphore* sem = buffer->fullCount; goto sem->p(takeBoundedBuffer1); } __code takeBoundedBuffer1(struct BoundedBuffer* buffer, __code next(union Data* data, ...)) { struct Semaphore* sem = buffer->lock; goto sem->p(takeBoundedBuffer2); } __code takeBoundedBuffer2(struct BoundedBuffer* buffer, __code next(union Data* data, ...)) { struct Element* top = buffer->top; struct Element* nextElement = top->next; data = nextElement->data; *O_data =data; buffer->top = nextElement; struct Semaphore* sem = buffer->lock; goto sem->v(takeBoundedBuffer3); } __code takeBoundedBuffer3(struct BoundedBuffer* buffer, __code next(union Data* data, ...)) { struct Semaphore* sem = buffer->emptyCount; goto sem->v(takeBoundedBuffer4); } __code takeBoundedBuffer4(struct BoundedBuffer* buffer, __code next(union Data* data, ...)) { goto next(data, ...); }