diff options
author | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2011-09-20 17:08:22 +0000 |
---|---|---|
committer | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2011-09-20 17:08:22 +0000 |
commit | 5463b41d3a7a81da20c88631535c088decd61999 (patch) | |
tree | daae26b7e2f842c1a869563e600e1df1fb1b3192 /os | |
parent | bd339dfa99310b372fc2699b79c700bbec7a0543 (diff) | |
download | ChibiOS-5463b41d3a7a81da20c88631535c088decd61999.tar.gz ChibiOS-5463b41d3a7a81da20c88631535c088decd61999.tar.bz2 ChibiOS-5463b41d3a7a81da20c88631535c088decd61999.zip |
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@3362 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os')
-rw-r--r-- | os/kernel/include/chthreads.h | 1 | ||||
-rw-r--r-- | os/kernel/src/chthreads.c | 24 | ||||
-rw-r--r-- | os/various/shell.c | 3 |
3 files changed, 26 insertions, 2 deletions
diff --git a/os/kernel/include/chthreads.h b/os/kernel/include/chthreads.h index bd3f21296..d99b2ee3b 100644 --- a/os/kernel/include/chthreads.h +++ b/os/kernel/include/chthreads.h @@ -345,6 +345,7 @@ extern "C" { void chThdSleepUntil(systime_t time);
void chThdYield(void);
void chThdExit(msg_t msg);
+ void chThdExitS(msg_t msg);
#if CH_USE_WAITEXIT
msg_t chThdWait(Thread *tp);
#endif
diff --git a/os/kernel/src/chthreads.c b/os/kernel/src/chthreads.c index 73236c850..b2231ef17 100644 --- a/os/kernel/src/chthreads.c +++ b/os/kernel/src/chthreads.c @@ -335,6 +335,27 @@ void chThdYield(void) { * @api
*/
void chThdExit(msg_t msg) {
+
+ chSysLock();
+ chThdExitS(msg);
+ /* The thread never returns here.*/
+}
+
+/**
+ * @brief Terminates the current thread.
+ * @details The thread goes in the @p THD_STATE_FINAL state holding the
+ * specified exit status code, other threads can retrieve the
+ * exit status code by invoking the function @p chThdWait().
+ * @post Eventual code after this function will never be executed,
+ * this function never returns. The compiler has no way to
+ * know this so do not assume that the compiler would remove
+ * the dead code.
+ *
+ * @param[in] msg thread exit code
+ *
+ * @sclass
+ */
+void chThdExitS(msg_t msg) {
Thread *tp = currp;
chSysLock();
@@ -353,7 +374,8 @@ void chThdExit(msg_t msg) { REG_REMOVE(tp);
#endif
chSchGoSleepS(THD_STATE_FINAL);
- chSysUnlock();
+ /* The thread never returns here.*/
+ chDbgAssert(FALSE, "chThdExitS(), #1", "zombies apocalypse");
}
#if CH_USE_WAITEXIT || defined(__DOXYGEN__)
diff --git a/os/various/shell.c b/os/various/shell.c index 8a247b9f4..b0f995757 100644 --- a/os/various/shell.c +++ b/os/various/shell.c @@ -204,9 +204,10 @@ static msg_t shell_thread(void *p) { }
}
}
+ /* Atomically broadcasting the event source and terminating the thread,
+ there is not a chSysUnlock() because the thread terminates upon return.*/
chSysLock();
chEvtBroadcastI(&shell_terminated);
- chSysUnlock();
return msg;
}
|