aboutsummaryrefslogtreecommitdiffstats
path: root/os/kernel/src/chqueues.c
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2011-01-02 14:01:18 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2011-01-02 14:01:18 +0000
commita1534ccb61d616ad15a69a668fe26466a87d76a9 (patch)
treeeaa8de9c94d7fb6d24f3a6f50c9f88700e04d8ec /os/kernel/src/chqueues.c
parent89c12799e185423b6c571b78d5b44e11e67adf72 (diff)
downloadChibiOS-a1534ccb61d616ad15a69a668fe26466a87d76a9.tar.gz
ChibiOS-a1534ccb61d616ad15a69a668fe26466a87d76a9.tar.bz2
ChibiOS-a1534ccb61d616ad15a69a668fe26466a87d76a9.zip
New queues APIs.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2571 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os/kernel/src/chqueues.c')
-rw-r--r--os/kernel/src/chqueues.c44
1 files changed, 38 insertions, 6 deletions
diff --git a/os/kernel/src/chqueues.c b/os/kernel/src/chqueues.c
index 87a82acf2..4a195fa9b 100644
--- a/os/kernel/src/chqueues.c
+++ b/os/kernel/src/chqueues.c
@@ -70,6 +70,22 @@ void chIQInit(InputQueue *iqp, uint8_t *bp, size_t size, qnotify_t infy) {
}
/**
+ * @brief Returns the filled space into an input queue.
+ *
+ * @param[in] iqp pointer to an @p InputQueue structure
+ *
+ * @iclass
+ */
+size_t chIQGetFullI(InputQueue *iqp) {
+ cnt_t cnt;
+
+ cnt = chQSpaceI(iqp);
+ if (cnt < 0)
+ return 0;
+ return (size_t)cnt;
+}
+
+/**
* @brief Resets an input queue.
* @details All the data in the input queue is erased and lost, any waiting
* thread is resumed with status @p Q_RESET.
@@ -136,7 +152,7 @@ msg_t chIQGetTimeout(InputQueue *iqp, systime_t time) {
chSysLock();
if (iqp->q_notify)
- iqp->q_notify();
+ iqp->q_notify(iqp);
if ((msg = chSemWaitTimeoutS(&iqp->q_sem, time)) < RDY_OK) {
chSysUnlock();
@@ -185,7 +201,7 @@ size_t chIQReadTimeout(InputQueue *iqp, uint8_t *bp,
while (TRUE) {
if (chIQIsEmptyI(iqp)) {
if (nfy)
- nfy();
+ nfy(iqp);
if ((chSemWaitTimeoutS(&iqp->q_sem, time) != RDY_OK)) {
chSysUnlock();
return r;
@@ -201,7 +217,7 @@ size_t chIQReadTimeout(InputQueue *iqp, uint8_t *bp,
if (--n == 0) {
chSysLock();
if (nfy)
- nfy();
+ nfy(iqp);
chSysUnlock();
return r;
}
@@ -233,6 +249,22 @@ void chOQInit(OutputQueue *oqp, uint8_t *bp, size_t size, qnotify_t onfy) {
}
/**
+ * @brief Returns the filled space into an output queue.
+ *
+ * @param[in] oqp pointer to an @p OutputQueue structure
+ *
+ * @iclass
+ */
+size_t chOQGetFullI(OutputQueue *oqp) {
+ cnt_t cnt;
+
+ cnt = chQSpaceI(oqp);
+ if (cnt < 0)
+ return chQSizeI(oqp);
+ return chQSizeI(oqp) - (size_t)cnt;
+}
+
+/**
* @brief Resets an output queue.
* @details All the data in the output queue is erased and lost, any waiting
* thread is resumed with status @p Q_RESET.
@@ -282,7 +314,7 @@ msg_t chOQPutTimeout(OutputQueue *oqp, uint8_t b, systime_t time) {
oqp->q_wrptr = oqp->q_buffer;
if (oqp->q_notify)
- oqp->q_notify();
+ oqp->q_notify(oqp);
chSysUnlock();
return Q_OK;
@@ -346,7 +378,7 @@ size_t chOQWriteTimeout(OutputQueue *oqp, const uint8_t *bp,
while (TRUE) {
if (chOQIsFullI(oqp)) {
if (nfy)
- nfy();
+ nfy(oqp);
if ((chSemWaitTimeoutS(&oqp->q_sem, time) != RDY_OK)) {
chSysUnlock();
return w;
@@ -362,7 +394,7 @@ size_t chOQWriteTimeout(OutputQueue *oqp, const uint8_t *bp,
if (--n == 0) {
chSysLock();
if (nfy)
- nfy();
+ nfy(oqp);
chSysUnlock();
return w;
}