static inline void sem_restorebaseprio_task(FAR struct tcb_s *stcb, FAR sem_t *sem) { FAR struct tcb_s *rtcb = (FAR struct tcb_s*)g_readytorun.head; FAR struct semholder_s *pholder; /* Perfom the following actions only if a new thread was given a count. * The thread that received the count should be the highest priority * of all threads waiting for a count from the semaphore. So in that * case, the priority of all holder threads should be dropped to the * next highest pending priority. */ if (stcb) { /* The currently executed thread should be the lower priority * thread that just posted the count and caused this action. * However, we cannot drop the priority of the currently running * thread -- becuase that will cause it to be suspended. * * So, do this in two passes. First, reprioritizing all holders * except for the running thread. */ (void)sem_foreachholder(sem, sem_restoreholderprioA, stcb); /* Now, find an reprioritize only the ready to run task */ (void)sem_foreachholder(sem, sem_restoreholderprioB, stcb); } /* If there are no tasks waiting for available counts, then all holders * should be at their base priority. */ #ifdef CONFIG_DEBUG else { (void)sem_foreachholder(sem, sem_verifyholder, NULL); } #endif /* In any case, the currently executing task should have an entry in the * list. Its counts were previously decremented; if it now holds no * counts, then we need to remove it from the list of holders. */ pholder = sem_findholder(sem, rtcb); if (pholder) { /* When no more counts are held, remove the holder from the list. The * count was decremented in sem_releaseholder. */ if (pholder->counts <= 0) { sem_freeholder(sem, pholder); } } }
static inline FAR struct semholder_s *sem_findorallocateholder(sem_t *sem, FAR _TCB *htcb) { FAR struct semholder_s *pholder = sem_findholder(sem, htcb); if (!pholder) { pholder = sem_allocholder(sem); } return pholder; }
void sem_releaseholder(FAR sem_t *sem) { FAR struct tcb_s *rtcb = (FAR struct tcb_s*)g_readytorun.head; FAR struct semholder_s *pholder; /* Find the container for this holder */ pholder = sem_findholder(sem, rtcb); if (pholder && pholder->counts > 0) { /* Decrement the counts on this holder -- the holder will be freed * later in sem_restorebaseprio. */ pholder->counts--; } }