void chooseThread(void) { word_t prio; word_t dom; tcb_t *thread; if (CONFIG_NUM_DOMAINS > 1) { dom = ksCurDomain; } else { dom = 0; } if (likely(ksReadyQueuesL1Bitmap[dom])) { word_t l1index = (wordBits - 1) - clzl(ksReadyQueuesL1Bitmap[dom]); word_t l2index = (wordBits - 1) - clzl(ksReadyQueuesL2Bitmap[dom][l1index]); prio = l1index_to_prio(l1index) | l2index; thread = ksReadyQueues[ready_queues_index(dom, prio)].head; assert(thread); assert(isRunnable(thread)); switchToThread(thread); } else { switchToIdleThread(); } }
/* Remove TCB from a scheduler queue */ void tcbSchedDequeue(tcb_t *tcb) { if (thread_state_get_tcbQueued(tcb->tcbState)) { tcb_queue_t queue; UNUSED dom_t dom; prio_t prio; unsigned int idx; dom = tcb->tcbDomain; prio = tcb->tcbPriority; idx = ready_queues_index(dom, prio); queue = ksReadyQueues[idx]; if (tcb->tcbSchedPrev) { tcb->tcbSchedPrev->tcbSchedNext = tcb->tcbSchedNext; } else { queue.head = tcb->tcbSchedNext; if (likely(!tcb->tcbSchedNext)) { removeFromBitmap(dom, prio); } } if (tcb->tcbSchedNext) { tcb->tcbSchedNext->tcbSchedPrev = tcb->tcbSchedPrev; } else { queue.end = tcb->tcbSchedPrev; } ksReadyQueues[idx] = queue; thread_state_ptr_set_tcbQueued(&tcb->tcbState, false); } }
/* Add TCB to the end of a scheduler queue */ void tcbSchedAppend(tcb_t *tcb) { if (!thread_state_get_tcbQueued(tcb->tcbState)) { tcb_queue_t queue; UNUSED dom_t dom; prio_t prio; unsigned int idx; dom = tcb->tcbDomain; prio = tcb->tcbPriority; idx = ready_queues_index(dom, prio); queue = ksReadyQueues[idx]; if (!queue.head) { /* Empty list */ queue.head = tcb; addToBitmap(dom, prio); } else { queue.end->tcbSchedNext = tcb; } tcb->tcbSchedPrev = queue.end; tcb->tcbSchedNext = NULL; queue.end = tcb; ksReadyQueues[idx] = queue; thread_state_ptr_set_tcbQueued(&tcb->tcbState, true); } }
void chooseThread(void) { word_t prio; word_t dom; tcb_t *thread; if (CONFIG_NUM_DOMAINS > 1) { dom = ksCurDomain; } else { dom = 0; } //printf("\n====In chooseThread=====\n"); //printf("domain is %d\n", dom); if (likely(ksReadyQueuesL1Bitmap[dom])) { uint32_t l1index = (wordBits - 1) - CLZ(ksReadyQueuesL1Bitmap[dom]); uint32_t l2index = (wordBits - 1) - CLZ(ksReadyQueuesL2Bitmap[dom][l1index]); prio = l1index_to_prio(l1index) | l2index; thread = ksReadyQueues[ready_queues_index(dom, prio)].head; assert(thread); assert(isRunnable(thread)); //printf("will call switchToThread(%p)\n", thread); //printf("its prio is %d\n", thread->tcbPriority); switchToThread(thread); return; } //printf(" IDLE THREAD\n"); switchToIdleThread(); }