diff options
author | Uros Majstorovic <majstor@majstor.org> | 2021-08-27 03:06:13 +0200 |
---|---|---|
committer | Uros Majstorovic <majstor@majstor.org> | 2021-08-27 03:06:13 +0200 |
commit | 76ec318118106cb25d762de83857f6579c13e273 (patch) | |
tree | ac1025b9e79a5eae04b6036d56599c0df98dcb08 /yocto/meta-bsp-rvphone/recipes-bsp/esp32spid/src/msgq.c | |
parent | 6d270f43cfea8e840463c260b43a6afbd24c1149 (diff) |
yocto rename
Diffstat (limited to 'yocto/meta-bsp-rvphone/recipes-bsp/esp32spid/src/msgq.c')
-rw-r--r-- | yocto/meta-bsp-rvphone/recipes-bsp/esp32spid/src/msgq.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/yocto/meta-bsp-rvphone/recipes-bsp/esp32spid/src/msgq.c b/yocto/meta-bsp-rvphone/recipes-bsp/esp32spid/src/msgq.c new file mode 100644 index 0000000..ff9f59e --- /dev/null +++ b/yocto/meta-bsp-rvphone/recipes-bsp/esp32spid/src/msgq.c @@ -0,0 +1,42 @@ +#include <stdlib.h> +#include <pthread.h> + +#include "msgq.h" + +#define IDX_MASK(IDX, SIZE) ((IDX) & ((SIZE) - 1)) + +int msgq_init(MSGQueue *msgq, unsigned char **array, uint16_t size) { + int rv; + + msgq->idx_r = 0; + msgq->idx_w = 0; + msgq->size = size; + msgq->array = array; + rv = pthread_mutex_init(&msgq->mutex, NULL); + if (rv) { + return MSGQ_ERR; + } + + rv = pthread_cond_init(&msgq->cond, NULL); + if (rv) { + pthread_mutex_destroy(&msgq->mutex); + return MSGQ_ERR; + } +} + +int msgq_push(MSGQueue *msgq, unsigned char *buffer) { + if ((uint16_t)(msgq->idx_w - msgq->idx_r) == msgq->size) return MSGQ_ERR_FULL; + + msgq->array[IDX_MASK(msgq->idx_w++, msgq->size)] = buffer; + return MSGQ_OK; +} + +unsigned char *msgq_pop(MSGQueue *msgq) { + if (msgq->idx_r == msgq->idx_w) return NULL; + + return msgq->array[IDX_MASK(msgq->idx_r++, msgq->size)]; +} + +uint16_t msgq_len(MSGQueue *msgq) { + return (uint16_t)(msgq->idx_w - msgq->idx_r); +} |