wait.c

待ち状態管理モジュール [詳細]

#include "fdmp_kernel.h"
#include "wait.h"

wait.cのインクルード依存関係図

ソースコードを見る。

関数

Inline BOOL make_non_wait (CCB *ccb, TCB *tcb)
 待ち解除のためのタスク状態の更新
Inline void queue_insert_tpri (TCB *tcb, QUEUE *queue)
 タスクの優先度順の待ちキューへの挿入
Inline void wobj_queue_insert (WOBJCB *wobjcb)
 実行中のタスクの同期・通信オブジェクトの待ちキューへの挿入


説明

待ち状態管理モジュール

wait.c で定義されています。


関数

Inline BOOL make_non_wait CCB ccb,
TCB tcb
 

待ち解除のためのタスク状態の更新

tcb で指定されるタスクを,待ち解除するようタスク状態を更新する.待 ち解除するタスクが実行できる状態になる場合は,レディキューにつなぐ. また,ディスパッチが必要な場合には TRUE を返す.

待ち状態を解除する場合は,必ずこの関数を呼び出すため,デットロック 回避のためのペンディングフラグのチェックをまとめて行う.

wait.c85 行で定義されています。

参照先 task_control_block::actcntassertFALSELOG_TSKSTATmake_activemake_dormantmake_runnabletask_control_block::pend_chgpritask_control_block::pend_newpritask_control_block::pend_relwaitask_control_block::pend_tertsktask_control_block::prioritytask_control_block::terflgTRUETS_SUSPENDEDtask_control_block::tstatTSTAT_SUSPENDEDTSTAT_WAITING.

00086 {
00087     assert(TSTAT_WAITING(tcb->tstat));
00088     
00089     /* タスク強制終了保留チェック */
00090     if (tcb->pend_tertsk) {
00091         /*
00092          * TCBを解放して,terflgをTRUEにする.
00093          * pend_tertskはmake_dormant()でクリアされる 
00094          */ 
00095         make_dormant(tcb);     
00096         tcb->terflg = TRUE;
00097         if (tcb->actcnt) {
00098             tcb->actcnt = FALSE;
00099             if (make_active(ccb, tcb)) {
00100                 return(TRUE);
00101             }
00102         }
00103         return(FALSE);
00104     }
00105     
00106     /* 優先度変更フラグチェック */
00107     if (tcb->pend_chgpri) {
00108         tcb->priority = tcb->pend_newpri;
00109         /*  優先度変更フラグのクリア  */
00110         tcb->pend_chgpri = FALSE;
00111     }
00112 
00113     /* タスク強制待ち解除保留クリア */
00114     tcb->pend_relwai = FALSE;
00115     
00116     if (!(TSTAT_SUSPENDED(tcb->tstat))) {
00117         /*
00118          *  待ち状態から実行できる状態への遷移
00119          */
00120         return(make_runnable(ccb, tcb));
00121     }
00122     else {
00123         /*
00124          *  二重待ち状態から強制待ち状態への遷移
00125          */
00126         tcb->tstat = TS_SUSPENDED;
00127         LOG_TSKSTAT(tcb);
00128         return(FALSE);
00129     }
00130 }

Inline void queue_insert_tpri TCB tcb,
QUEUE queue
 

タスクの優先度順の待ちキューへの挿入

wait.c262 行で定義されています。

参照先 entryqueue::nexttask_control_block::priorityqueue_insert_prev()task_control_block::task_queue.

参照元 wobj_queue_insert().

00263 {
00264     QUEUE   *entry;
00265     UINT    priority = tcb->priority;
00266 
00267     for (entry = queue->next; entry != queue; entry = entry->next) {
00268         if (priority < ((TCB *) entry)->priority) {
00269             break;
00270         }
00271     }
00272     queue_insert_prev(entry, &(tcb->task_queue));
00273 }

関数の呼び出しグラフ:

Inline void wobj_queue_insert WOBJCB wobjcb  ) 
 

実行中のタスクの同期・通信オブジェクトの待ちキューへの挿入

wait.c280 行で定義されています。

参照先 queue_insert_prev()queue_insert_tpri()runtskTA_TPRIwait_object_control_block::wait_queuewait_object_initialization_block::wobjatrwait_object_control_block::wobjinib.

00281 {
00282     if ((wobjcb->wobjinib->wobjatr & TA_TPRI) != 0) {
00283         queue_insert_tpri(runtsk, &(wobjcb->wait_queue));
00284     }
00285     else {
00286         queue_insert_prev(&(wobjcb->wait_queue),
00287                     &(runtsk->task_queue));
00288     }
00289 }

関数の呼び出しグラフ:


Copyright © 2006 by TAKAGI Nobuhisa.
このページは Mon Apr 3 23:49:19 2006 に Doxygen によって生成されました。