/* * Timeout wakeup callback. */ static void wakeup(void *p) { Thread *tp = (Thread *)p; chSysLockFromIsr(); switch (tp->p_state) { case THD_STATE_READY: /* Handling the special case where the thread has been made ready by another thread with higher priority.*/ chSysUnlockFromIsr(); return; #if CH_USE_SEMAPHORES || CH_USE_QUEUES || \ (CH_USE_CONDVARS && CH_USE_CONDVARS_TIMEOUT) #if CH_USE_SEMAPHORES case THD_STATE_WTSEM: chSemFastSignalI((Semaphore *)tp->p_u.wtobjp); /* Falls into, intentional. */ #endif #if CH_USE_QUEUES case THD_STATE_WTQUEUE: #endif #if CH_USE_CONDVARS && CH_USE_CONDVARS_TIMEOUT case THD_STATE_WTCOND: #endif /* States requiring dequeuing.*/ dequeue(tp); #endif } tp->p_u.rdymsg = RDY_TIMEOUT; chSchReadyI(tp); chSysUnlockFromIsr(); }
/* * Timeout wakeup callback. */ static void wakeup(void *p) { thread_t *tp = (thread_t *)p; chSysLockFromISR(); switch (tp->p_state) { case CH_STATE_READY: /* Handling the special case where the thread has been made ready by another thread with higher priority.*/ chSysUnlockFromISR(); return; case CH_STATE_SUSPENDED: *(thread_reference_t *)tp->p_u.wtobjp = NULL; break; #if CH_CFG_USE_SEMAPHORES case CH_STATE_WTSEM: chSemFastSignalI((semaphore_t *)tp->p_u.wtobjp); /* Falls into, intentional. */ #endif #if CH_CFG_USE_CONDVARS && CH_CFG_USE_CONDVARS_TIMEOUT case CH_STATE_WTCOND: #endif case CH_STATE_QUEUED: /* States requiring dequeuing.*/ queue_dequeue(tp); } tp->p_u.rdymsg = MSG_TIMEOUT; chSchReadyI(tp); chSysUnlockFromISR(); }