aboutsummaryrefslogtreecommitdiffstats
path: root/os
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2011-09-20 17:08:22 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2011-09-20 17:08:22 +0000
commit5463b41d3a7a81da20c88631535c088decd61999 (patch)
treedaae26b7e2f842c1a869563e600e1df1fb1b3192 /os
parentbd339dfa99310b372fc2699b79c700bbec7a0543 (diff)
downloadChibiOS-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.h1
-rw-r--r--os/kernel/src/chthreads.c24
-rw-r--r--os/various/shell.c3
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;
}