diff options
author | Robert Gustafsson <robg@student.chalmers.se> | 2017-10-27 09:17:21 +0200 |
---|---|---|
committer | Robert Gustafsson <robg@student.chalmers.se> | 2017-10-27 09:18:45 +0200 |
commit | a8ad8cbeda0e0dd5d29c5d4dc5afeaa9c4fccfdf (patch) | |
tree | 25adf2c37d6d0f965bc5302bcb957c8458553303 | |
parent | ef2139ca2d442979daefa9e84cc9d27ce620d9e2 (diff) | |
download | midbro-a8ad8cbeda0e0dd5d29c5d4dc5afeaa9c4fccfdf.tar.gz midbro-a8ad8cbeda0e0dd5d29c5d4dc5afeaa9c4fccfdf.tar.bz2 |
Add semaphore to block producer if buffer is full
-rw-r--r-- | broccoli/includes/types.h | 1 | ||||
-rw-r--r-- | broccoli/src/fifoqueue.c | 18 |
2 files changed, 11 insertions, 8 deletions
diff --git a/broccoli/includes/types.h b/broccoli/includes/types.h index b23da1a..149415e 100644 --- a/broccoli/includes/types.h +++ b/broccoli/includes/types.h @@ -30,6 +30,7 @@ struct fifo_q{ int valuesReceived; int valuesReleased; sem_t bufferEmptyBlock; + sem_t bufferFullBlock; sem_t lock; }; diff --git a/broccoli/src/fifoqueue.c b/broccoli/src/fifoqueue.c index 3911eb7..a02f55c 100644 --- a/broccoli/src/fifoqueue.c +++ b/broccoli/src/fifoqueue.c @@ -19,6 +19,7 @@ init_queue(int size) q->valuesReleased = 0; /*Queue empty from the beginning (block)*/ sem_init(&q->bufferEmptyBlock, 0, 0); + sem_init(&q->bufferFullBlock, 0, size); sem_init(&q->lock, 0, 1); return q; } @@ -50,15 +51,16 @@ add_to_queue(Fifo_q * q, Sensor_t * sensor) free(sensor); //free if not appended return -1; } - else if(is_full(q)){ - /* Drop Least Recently or Drop Most Recently */ - #ifdef DLR - pop_from_queue(q); - #endif + /* Drop Least Recently or Drop Most Recently */ + #ifdef DLR + if(is_full(q)){ + pop_from_queue(q); q->droppedValues++; - free(sensor); //free if not appended return 0; } + #else + sem_wait(&q->bufferFullBlock); + #endif sem_wait(&q->lock); Queue_t * new_elem = (Queue_t *) malloc(sizeof(Queue_t)); new_elem->next = NULL; @@ -94,10 +96,10 @@ pop_from_queue(Fifo_q * q) } free(head); q->currentSize--; + sem_post(&q->lock); #ifndef DLR - q->valuesReleased++; + sem_post(&q->bufferFullBlock); #endif - sem_post(&q->lock); return sensor; } |