/** * @brief Terminates the current thread. * @details The thread goes in the @p CH_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_t *tp = currp; tp->u.exitcode = msg; CH_CFG_THREAD_EXIT_HOOK(tp); #if CH_CFG_USE_WAITEXIT == TRUE while (list_notempty(&tp->waiting)) { (void) chSchReadyI(list_remove(&tp->waiting)); } #endif #if CH_CFG_USE_REGISTRY == TRUE REG_REMOVE(tp); #endif chSchGoSleepS(CH_STATE_FINAL); /* The thread never returns here.*/ chDbgAssert(false, "zombies apocalypse"); }
/** * @brief Terminates the current thread. * @details The thread goes in the @p CH_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_t *tp = currp; tp->p_u.exitcode = msg; #if defined(CH_CFG_THREAD_EXIT_HOOK) CH_CFG_THREAD_EXIT_HOOK(tp); #endif #if CH_CFG_USE_WAITEXIT while (list_notempty(&tp->p_waiting)) chSchReadyI(list_remove(&tp->p_waiting)); #endif #if CH_CFG_USE_REGISTRY /* Static threads are immediately removed from the registry because there is no memory to recover.*/ if ((tp->p_flags & CH_FLAG_MODE_MASK) == CH_FLAG_MODE_STATIC) REG_REMOVE(tp); #endif chSchGoSleepS(CH_STATE_FINAL); /* The thread never returns here.*/ chDbgAssert(false, "zombies apocalypse"); }