JSPにref系のAPIを追加してみようか
JSPにはカーネルオブジェクトを参照するためのref_yyyが無いので、追加してみようという試み。
FI4やASPでも実装されているから何とかなるだろうと思っていたが...
タスクの待ち要因
JSPでタスク状態の内部表現(runtsk->tstat)は次のようになっている
#define TS_WAIT_SLEEP 0x08u /* 起床待ち状態 */ #define TS_WAIT_WOBJ 0x10u /* 同期・通信オブジェクトに対する待ち状態 */ #define TS_WAIT_WOBJCB 0x20u /* 共通部分の待ちキューにつながっている */
つまり、現状のコードではセマフォやイベントフラグなどの同期・通信オブジェクトからの待ちは一緒にされているので、どのオブジェクトからの待ちかがわからない状態になっているようだ。
JSPではwait.cのwobj_make_wait()でまとめて処理している。
wobj_make_wait(WOBJCB *wobjcb, WINFO_WOBJ *winfo) { runtsk->tstat = (TS_WAITING | TS_WAIT_WOBJ | TS_WAIT_WOBJCB); make_wait(&(winfo->winfo)); wobj_queue_insert(wobjcb); winfo->wobjcb = wobjcb; LOG_TSKSTAT(runtsk); }
ASPではwobj_make_wait()を呼ぶ前にruntsk->tstatをそれぞれのオブジェクトで設定しているようなので、JSPも変更する必要はあるのか...
で、ちなみにFI4のコードは
ref_tstの該当コードは
/* TODO: pk_rtst->tskwait = tcb-> */
固定長メモリープールの空きメモリブロック数
ASPではMPFCBにブロック数の変数を追加している
typedef struct fixed_memorypool_control_block { QUEUE wait_queue; /* 固定長メモリプール待ちキュー */ const MPFINIB *p_mpfinib; /* 初期化ブロックへのポインタ */ uint_t fblkcnt; /* 未割当てブロック数 */ uint_t unused; /* 未使用ブロックの先頭 */ uint_t freelist; /* 未割当てブロックのリスト */ } MPFCB;
素直な実装ではあるけれども、CBを変更するのはちょっと避けたいところ