/** * @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 * * @api */ void chThdExit(msg_t msg) { Thread *tp = currp; chSysLock(); tp->p_u.exitcode = msg; #if defined(THREAD_EXT_EXIT_HOOK) THREAD_EXT_EXIT_HOOK(tp); #endif #if CH_USE_WAITEXIT while (notempty(&tp->p_waiting)) chSchReadyI(list_remove(&tp->p_waiting)); #endif #if CH_USE_REGISTRY /* Static threads are immediately removed from the registry because there is no memory to recover.*/ if ((tp->p_flags & THD_MEM_MODE_MASK) == THD_MEM_MODE_STATIC) REG_REMOVE(tp); #endif chSchGoSleepS(THD_STATE_FINAL); }
/** * @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; tp->p_u.exitcode = msg; #if defined(THREAD_EXT_EXIT_HOOK) THREAD_EXT_EXIT_HOOK(tp); #endif #if CH_USE_WAITEXIT while (notempty(&tp->p_waiting)) chSchReadyI(list_remove(&tp->p_waiting)); #endif #if CH_USE_REGISTRY /* Static threads are immediately removed from the registry because there is no memory to recover.*/ if ((tp->p_flags & THD_MEM_MODE_MASK) == THD_MEM_MODE_STATIC) REG_REMOVE(tp); #endif chSchGoSleepS(THD_STATE_FINAL); /* The thread never returns here.*/ chDbgAssert(FALSE, "chThdExitS(), #1", "zombies apocalypse"); }