extern void rem_from_runqueue(runqueue_t *runq, gt_spinlock_t *runq_lock, uthread_struct_t *u_elem) { gt_spin_lock(runq_lock); runq_lock->holder = 0x03; __rem_from_runqueue(runq, u_elem); gt_spin_unlock(runq_lock); return; }
extern void rem_from_runqueue(runqueue_t *runq, gt_spinlock_t *runq_lock, pcs_uthread_t *u_elem) { if (runq_lock) { gt_spin_lock(runq_lock); runq_lock->holder = 0x03; } __rem_from_runqueue(runq, u_elem); if (runq_lock) gt_spin_unlock(runq_lock); return; }
extern uthread_struct_t *sched_find_best_uthread(kthread_runqueue_t *kthread_runq) { /* [1] Tries to find the highest priority RUNNABLE uthread in active-runq. * [2] Found - Jump to [FOUND] * [3] Switches runqueues (active/expires) * [4] Repeat [1] through [2] * [NOT FOUND] Return NULL(no more jobs) * [FOUND] Remove uthread from pq and return it. */ runqueue_t *runq; prio_struct_t *prioq; uthread_head_t *u_head; uthread_struct_t *u_obj; unsigned int uprio, ugroup; gt_spin_lock(&(kthread_runq->kthread_runqlock)); runq = kthread_runq->active_runq; kthread_runq->kthread_runqlock.holder = 0x04; if(!(runq->uthread_mask)) { /* No jobs in active. switch runqueue */ assert(!runq->uthread_tot); kthread_runq->active_runq = kthread_runq->expires_runq; kthread_runq->expires_runq = runq; runq = kthread_runq->expires_runq; if(!runq->uthread_mask) { assert(!runq->uthread_tot); gt_spin_unlock(&(kthread_runq->kthread_runqlock)); return NULL; } } /* Find the highest priority bucket */ uprio = LOWEST_BIT_SET(runq->uthread_mask); prioq = &(runq->prio_array[uprio]); assert(prioq->group_mask); ugroup = LOWEST_BIT_SET(prioq->group_mask); u_head = &(prioq->group[ugroup]); u_obj = TAILQ_FIRST(u_head); __rem_from_runqueue(runq, u_obj); gt_spin_unlock(&(kthread_runq->kthread_runqlock)); #if U_DEBUG printf("cpu(%d) : sched best uthread(id:%d, group:%d)\n", u_obj->cpu_id, u_obj->uthread_tid, u_obj->uthread_gid); #endif return(u_obj); }
static void empty_runq(runqueue_t *runq) { uthread_struct_t *u_obj; int inx; /* Remove and delete */ for(inx=0; inx<MAX_UTHREADS; inx++) { u_obj = &u_objs[inx]; __rem_from_runqueue(runq, u_obj); printf("Uthread (id:%d , prio:%d) removed\n", u_obj->uthread_tid, u_obj->uthread_priority); } return; }