aboutsummaryrefslogtreecommitdiffstats
path: root/os
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2014-02-11 13:00:24 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2014-02-11 13:00:24 +0000
commit7f3e0e57b2a13aa4797a8409e6e63671cb6d6993 (patch)
treeee6dc2a23554eb38ca360393d91cf7a0867360c1 /os
parent4541bd732acf21e30f40f5b6c991172e2e350cb0 (diff)
downloadChibiOS-7f3e0e57b2a13aa4797a8409e6e63671cb6d6993.tar.gz
ChibiOS-7f3e0e57b2a13aa4797a8409e6e63671cb6d6993.tar.bz2
ChibiOS-7f3e0e57b2a13aa4797a8409e6e63671cb6d6993.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/kernel_3_dev@6701 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os')
-rw-r--r--os/nil/include/nil.h8
-rw-r--r--os/nil/src/nil.c37
2 files changed, 42 insertions, 3 deletions
diff --git a/os/nil/include/nil.h b/os/nil/include/nil.h
index 7ba088dac..161c79a6d 100644
--- a/os/nil/include/nil.h
+++ b/os/nil/include/nil.h
@@ -597,6 +597,13 @@ typedef struct {
#define chSchIsRescRequiredI() ((bool)(nil.current != nil.next))
/**
+ * @brief Returns a pointer to the current @p thread_t.
+ *
+ * @xclass
+ */
+#define chThdGetSelfX() nil.current
+
+/**
* @brief Delays the invoking thread for the specified number of seconds.
* @note The specified time is rounded up to a value allowed by the real
* system clock.
@@ -802,6 +809,7 @@ extern "C" {
void chEvtSignal(thread_t *tp, eventmask_t mask);
void chEvtSignalI(thread_t *tp, eventmask_t mask);
eventmask_t chEvtWaitAnyTimeout(eventmask_t mask, systime_t timeout);
+ eventmask_t chEvtWaitAnyTimeoutS(eventmask_t mask, systime_t timeout);
#ifdef __cplusplus
}
#endif
diff --git a/os/nil/src/nil.c b/os/nil/src/nil.c
index 9141129cb..edd717600 100644
--- a/os/nil/src/nil.c
+++ b/os/nil/src/nil.c
@@ -489,7 +489,9 @@ msg_t chSemWaitTimeout(semaphore_t *sp, systime_t timeout) {
msg_t msg;
chSysLock();
+
msg = chSemWaitTimeoutS(sp, timeout);
+
chSysUnlock();
return msg;
}
@@ -599,8 +601,10 @@ void chSemSignalI(semaphore_t *sp) {
void chSemReset(semaphore_t *sp, cnt_t n) {
chSysLock();
+
chSemResetI(sp, n);
chSchRescheduleS();
+
chSysUnlock();
}
@@ -654,8 +658,10 @@ void chSemResetI(semaphore_t *sp, cnt_t n) {
void chEvtSignal(thread_t *tp, eventmask_t mask) {
chSysLock();
+
chEvtSignalI(tp, mask);
chSchRescheduleS();
+
chSysUnlock();
}
@@ -697,11 +703,38 @@ void chEvtSignalI(thread_t *tp, eventmask_t mask) {
* @api
*/
eventmask_t chEvtWaitAnyTimeout(eventmask_t mask, systime_t timeout) {
- thread_t *ctp = nil.current;
eventmask_t m;
chSysLock();
+ m = chEvtWaitAnyTimeoutS(mask, timeout);
+
+ chSysUnlock();
+ return m;
+}
+
+/**
+ * @brief Waits for any of the specified events.
+ * @details The function waits for any event among those specified in
+ * @p mask to become pending then the events are cleared and
+ * returned.
+ *
+ * @param[in] mask mask of the event flags that the function should wait
+ * for, @p ALL_EVENTS enables all the events
+ * @param[in] timeout the number of ticks before the operation timeouts,
+ * the following special values are allowed:
+ * - @a TIME_IMMEDIATE immediate timeout.
+ * - @a TIME_INFINITE no timeout.
+ * .
+ * @return The mask of the served and cleared events.
+ * @retval 0 if the operation has timed out.
+ *
+ * @sclass
+ */
+eventmask_t chEvtWaitAnyTimeoutS(eventmask_t mask, systime_t timeout) {
+ thread_t *ctp = nil.current;
+ eventmask_t m;
+
if ((m = (ctp->epmask & mask)) == 0) {
if (TIME_IMMEDIATE == timeout) {
chSysUnlock();
@@ -715,8 +748,6 @@ eventmask_t chEvtWaitAnyTimeout(eventmask_t mask, systime_t timeout) {
m = ctp->epmask & mask;
}
ctp->epmask &= ~m;
-
- chSysUnlock();
return m;
}