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(); } }
int _cspace_single_level_alloc(allocman_t *alloc, void *_cspace, cspacepath_t *slot) { size_t i; size_t index; cspace_single_level_t *cspace = (cspace_single_level_t*)_cspace; i = cspace->last_entry; if (cspace->bitmap[i] == 0) { assert(cspace->bitmap_length != 0); assert(cspace->last_entry < cspace->bitmap_length); do { i = (i + 1) % cspace->bitmap_length; } while (cspace->bitmap[i] == 0 && i != cspace->last_entry); if (i == cspace->last_entry) { return 1; } cspace->last_entry = i; } index = BITS_PER_WORD - 1 - CLZL(cspace->bitmap[i]); cspace->bitmap[i] &= ~BIT(index); *slot = _cspace_single_level_make_path(cspace, cspace->config.first_slot + (i * BITS_PER_WORD + index)); return 0; }
/** DONT_TRANSLATE */ BOOT_CODE static word_t boot_clzl (word_t x) { return CLZL (x); }