dequeueproc()

dequeueproc()

概要

引数

  • rq -- Schedq
  • tp -- Proc.ターゲットプロセス

実装

  359: /*
  360:  *  try to remove a process from a scheduling queue (called splhi)
  361:  */
  362: Proc*
  363: dequeueproc(Schedq *rq, Proc *tp)
  364: {
  365:         Proc *l, *p;
  366: 
  367:         if(!canlock(runq))
  • ランキューのロックを獲得できなかったら,nilを返す.
  • 詳細はcanlock()にて定義
  368:                 return nil;
  369: 
  370:         /*
  371:          *  the queue may have changed before we locked runq,
  372:          *  refind the target process.
  373:          */
  374:         l = 0;
  375:         for(p = rq->head; p; p = p->rnext){
  376:                 if(p == tp)
  377:                         break;
  378:                 l = p;
  379:         }
  • ターゲットプロセスがランキューにあるかチェックする.
  380: 
  381:         /*
  382:          *  p->mach==0 only when process state is saved
  383:          */
  384:         if(p == 0 || p->mach){
  385:                 unlock(runq);
  • ターゲットプロセスがすでにランキューから取り除かれているか,p->machnilのときは,ランキューのロックを解放して,nilを返す.
  • 詳細はunlock()にて定義
  386:                 return nil;
  387:         }
  388:         if(p->rnext == 0)
  389:                 rq->tail = l;
  390:         if(l)
  391:                 l->rnext = p->rnext;
  392:         else
  393:                 rq->head = p->rnext;
  394:         if(rq->head == nil)
  395:                 runvec &= ~(1<<(rq-runq));
  396:         rq->n--;
  397:         nrdy--;
  398:         if(p->state != Ready)
  399:                 print("dequeueproc %s %lud %s\n", p->text, p->pid, statename[p->state]);
  400: 
  401:         unlock(runq);
  402:         return p;
  • ランキューから取り除いたプロセスを返す.
  403: }