From 9f9aeae4bf73fab87b95427a52a4bfe3c2098055 Mon Sep 17 00:00:00 2001 From: NIIBE Yutaka Date: Thu, 14 Dec 2017 15:47:18 +0900 Subject: [PATCH] Add bb.c, bb.h. --- bb.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ bb.h | 11 ++++++++ rules.mk | 4 +++ 3 files changed, 93 insertions(+) create mode 100644 bb.c create mode 100644 bb.h diff --git a/bb.c b/bb.c new file mode 100644 index 0000000..9ca91ce --- /dev/null +++ b/bb.c @@ -0,0 +1,78 @@ +/* + * bb.c - Bounded Buffer + * + * Copyright (C) 2017 Flying Stone Technology + * Author: NIIBE Yutaka + * + * This file is a part of Chopstx, a thread library for embedded. + * + * Chopstx is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Chopstx is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * As additional permission under GNU GPL version 3 section 7, you may + * distribute non-source form of the Program without the copy of the + * GNU GPL normally required by section 4, provided you inform the + * receipents of GNU GPL by a written offer. + * + */ + +#include +#include +#include +#include + +void +bb_init (struct bb *bb, uint32_t items) +{ + bb->items = items; + chopstx_cond_init (&bb->cond); + chopstx_mutex_init (&bb->mutex); +} + +void +bb_get (struct bb *bb) +{ + chopstx_mutex_lock (&bb->mutex); + while (bb->items == 0) + chopstx_cond_wait (&bb->cond, &bb->mutex); + bb->items--; + chopstx_mutex_unlock (&bb->mutex); +} + +void +bb_put (struct bb *bb) +{ + chopstx_mutex_lock (&bb->mutex); + bb->items++; + chopstx_cond_signal (&bb->cond); + chopstx_mutex_unlock (&bb->mutex); +} + +static int +bb_check (void *arg) +{ + struct bb *bb = arg; + + return bb->items != 0; +} + +void +bb_prepare_poll (struct bb *bb, chopstx_poll_cond_t *p) +{ + poll_desc->type = CHOPSTX_POLL_COND; + poll_desc->ready = 0; + poll_desc->cond = &bb->cond; + poll_desc->mutex = &bb->mutex; + poll_desc->check = bb_check; + poll_desc->arg = ev; +} diff --git a/bb.h b/bb.h new file mode 100644 index 0000000..1251b3f --- /dev/null +++ b/bb.h @@ -0,0 +1,11 @@ +struct bb { + chopstx_mutex_t mutex; + chopstx_cond_t cond; + uint32_t items; +}; + +void bb_init (struct bb *bb, uint32_t items); +void bb_get (struct bb *bb); +void bb_put (struct bb *bb); + +void bb_prepare_poll (struct bb *bb, chopstx_poll_cond_t *p); diff --git a/rules.mk b/rules.mk index f71beb6..6f15d38 100644 --- a/rules.mk +++ b/rules.mk @@ -2,6 +2,10 @@ CSRC += $(CHOPSTX)/entry.c $(CHOPSTX)/chopstx.c +ifneq ($(USE_BB),) +CSRC += $(CHOPSTX)/bb.c +endif + ifneq ($(USE_EVENTFLAG),) CSRC += $(CHOPSTX)/eventflag.c endif