この章の目次にもどる
前頁:1.2 メッセージ管理にもどる
次頁:1.4 グローバル名管理にすすむ

1.3 プロセス/タスク間同期通信管理

プロセス / タスク間の同期や通信を行うための機構として、 下記の同期通信機能を提供する。

これらの同期・通信オブジェクトは動的に生成され、 生成時に割り当てられたID ( > 0 ) により識別される。

メッセージによる通信と一番大きく異なる点は、 メッセージがプロセス間の通信であるのに対し、 タスク間の通信であることである。 したがって、主な用途はプロセス内のタスク間の同期・通信である。 生成したオブジェクトはすべてのプロセスから使用可能となるので、 プロセス間の同期・通信にも使用できる。

1.3.1 データ / 定数の定義

□ タイムアウト定義

typedef W   TMOUT;          /* タイムアウト指定 (ミリ秒) */
#define T_NOWAIT    ( 0)    /* 待たない */
#define T_FOREVER   (-1)    /* 永久待ち */

□ セマフォ定数定義

#define SEM_SYNC    0x0000  /* 同期用セマフォ */
#define SEM_EXCL    0x4000  /* 排他制御用セマフォ */

□ イベントフラグ定数定義

#define WF_AND      0x0000  /* イベントフラグ AND 待ち */
#define WF_OR       0x0002  /* イベントフラグ OR  待ち */

1.3.2 システムコール

cre_sem
 
セマフォの生成

【形式】

WERR    cre_sem(W cnt, UW opt)

【パラメータ】

W   cnt セマフォ初期値
        同期用セマフォの場合には cnt ≧ 0 でなければならない。
        排他制御用セマフォの場合には cnt = 1 でなければならない。

UW  opt セマフォ属性
        ( SEM_SYNC ‖ SEM_EXCL ) | [ DELEXIT ]
        SEM_SYNC    同期用セマフォ
        SEM_EXCL    排他制御用セマフォ
        DELEXIT     生成プロセス終了時に自動削除

【リターン値】

>0   正常(生成したセマフォID)
<0   エラー(エラーコード)

【解説】

セマフォを生成する。 生成したセマフォは、すべてのプロセスから使用可能である。

SEM_EXCL -- 排他制御用セマフォ
SEM_SYNC -- 同期用セマフォ

【エラーコード】

ER_NOSPC    : システムのメモリ領域が不足した。
ER_LIMIT    : セマフォの数がシステムの制限を超えた。
ER_PAR      : パラメータが不正である。
del_sem
 
セマフォの削除

【形式】

ERR del_sem(ID id)

【パラメータ】

ID  id  セマフォID

【リターン値】

=0  正常
<0  エラー(エラーコード)

【解説】

セマフォを削除する。
削除したセマフォで待ち状態にあったタスクは待ちが解除され、 そのタスクへ ER_DLT が返される。

【エラーコード】

ER_ID       : セマフォIDが不正である。
ER_NOEXS    : セマフォは存在していない。
sig_sem
 
セマフォへ資源の返却

【形式】

ERR sig_sem(ID id)

【パラメータ】

ID  id  セマフォID

【リターン値】

=0  正常
<0  エラー(エラーコード)

【解説】

セマフォへ資源を 1 つ返却する。

セマフォの資源待ちのタスクがあれば、 待ち行列の先頭のタスクの待ちを解除する。 資源待ちのタスクがなければ、セマフォの資源を 1 増やす。

排他制御用セマフォの場合には、 対象セマフォの資源を獲得していない状態で返却しようとした場合は ER_OBJ になる。

【エラーコード】

ER_ID       : セマフォIDが不正である。
ER_LIMIT    : セマフォのカウント値が制限を越えた。
ER_NOEXS    : セマフォは存在していない。
ER_OBJ      : 排他制御用セマフォに対しての不正操作である。
wai_sem
 
セマフォから資源の獲得

【形式】

ERR wai_sem(ID id, TMOUT tmo)

【パラメータ】

ID      id      セマフォID

TMOUT   tmo         タイムアウト指定 (ミリ秒)
        T_NOWAIT    資源を獲得できなくても待たない
        T_FOREVER   資源を獲得できるまで待つ
        >0          資源を獲得できるまで最長 tmo ミリ秒待つ

【リターン値】

=0  正常
<0  エラー(エラーコード)

【解説】

セマフォから資源を 1 つ獲得する。 セマフォに 1 つ以上の資源がある場合には、 その資源を 1 つ獲得する ( 減らす )。 資源が 0 の場合には、sig_sem() により資源が返却されるのを待つ。 指定された待ち時間が経過しても資源が獲得できない場合には、 ER_NONE が返される。

排他制御用セマフォの場合 :

【エラーコード】

ER_DLT      : セマフォは獲得待ちの間に削除された。
ER_ID       : セマフォIDが不正である。
ER_MINTR    : メッセージハンドラが起動されたため待ち処理が中断された。
ER_NOEXS    : セマフォは存在していない。
ER_NONE     : セマフォを獲得できずにタイムアウトした。
ER_PAR      : パラメータが不正である。
ER_OBJ      : 排他制御用セマフォに対しての不正操作である。
cre_flg
 
イベントフラグの生成

【形式】

WERR    cre_flg(W ptn, UW opt)

【パラメータ】

W   ptn イベントフラグ初期パターン (≧0)

UW  opt イベントフラグ属性
        [ DELEXIT ]
        DELEXIT     生成プロセス終了時に自動削除

【リターン値】

>0   正常(イベントフラグID)
<0   エラー(エラーコード)

【解説】

イベントフラグを生成する。 生成したイベントフラグは、 すべてのプロセスから使用可能である。

【エラーコード】

ER_NOSPC    : システムのメモリ領域が不足した。
ER_LIMIT    : イベントフラグの数がシステムの制限を超えた。
ER_PAR      : パラメータが不正である。
del_flg
 
イベントフラグの削除

【形式】

ERR del_flg(ID id)

【パラメータ】

ID  id  イベントフラグID

【リターン値】

=0   正常
<0   エラー(エラーコード)

【解説】

イベントフラグを削除する。 削除したイベントフラグで待ち状態にあったタスクは待ちが解除され、 そのタスクへ ER_DLT が返される。

【エラーコード】

ER_ID       : イベントフラグIDが不正である。
ER_NOEXS    : イベントフラグは存在していない。
set_flg
 
イベントフラグをセット

【形式】

ERR set_flg(ID id, W ptn)

【パラメータ】

ID      id      イベントフラグID
W       ptn     イベントフラグ設定パターン (≧0)

【リターン値】

=0  正常
<0  エラー(エラーコード)

【解説】

イベントフラグの現在の値に ptn が OR (論理和)される。
その結果、待ち状態にあるタスクの待ち解除条件が満たされれば、 そのタスクの待ちが解除される。

【エラーコード】

ER_ID       : イベントフラグIDが不正である。
ER_NOEXS    : イベントフラグは存在していない。
ER_PAR      : パラメータが不正である。
clr_flg
 
イベントフラグをクリア

【形式】

ERR clr_flg(ID id, W ptn)

【パラメータ】

ID      id     イベントフラグID
W       ptn    イベントフラグ消去パターン

【リターン値】

=0   正常
<0   エラー(エラーコード)

【解説】

イベントフラグの現在の値に ptn が AND (論理積)される。
イベントフラグのクリアで、タスクの待ちが解除されることはない。

【エラーコード】

ER_ID       : イベントフラグIDが不正である。
ER_NOEXS    : イベントフラグは存在していない。
wai_flg
 
イベントフラグ待ち

【形式】

WERR    wai_flg(ID id, W ptn, UW mode, TMOUT tmo)

【パラメータ】

ID  id  イベントフラグID

W   ptn 待ちパターン (>0)

UW  mode    待ち解除条件
        ( WF_AND ‖ WF_OR ) | [ NOCLR ]
        WF_AND  0x0000  ptn で1のビットがすべてセットされるまで待つ
        WF_OR   0x0002  ptn で1のビットのいずれかがセットされるまで待つ
        NOCLR   0x0008  待ち解除条件が満たされた時、イベントフラグの値を
                        クリアしない

TMOUT   tmo タイムアウト指定 (ミリ秒)
        T_NOWAIT    待ち解除条件が満たされなくても待たない
        T_FOREVER   待ち解除条件が満たされるまで待つ
        >0          待ち解除条件が満たされるまで最長 tmo ミリ秒待つ

【リターン値】

>0   正常(待ち状態が解除されたときのイベントフラグの値)
<0   エラー(エラーコード)

【解説】

mode で指定された条件にしたがって、 イベントフラグがセットされるのを待つ。

次の条件が満たされたとき待ち解除となる。

WF_AND の時 ( flg & ptn ) == ptn
WF_OR の時  ( flg & ptn ) != 0
        ∵ flg はイベントフラグの値

NOCLR が指定された時には、 待ち解除条件が満たされたときイベントフラグの値は変化しない。 NOCLR の指定がない場合には、 待ち解除条件が満たされたときイベントフラグの値 ( 全ビット ) が 0 クリアされる。

指定された待ち時間が経過しても待ち解除条件が満たされない場合には、 ER_NONE が返される。

【エラーコード】

ER_DLT      : イベントフラグが待ちの間に削除された。
ER_ID       : イベントフラグIDが不正である。
ER_MINTR    : メッセージハンドラが起動されたため待ち処理が中断された。
ER_NOEXS    : イベントフラグは存在していない。
ER_NONE     : イベントフラグの条件が満たされずにタイムアウトした。
ER_PAR      : パラメータが不正である。
cre_mbf
 
メッセージバッファの生成

【形式】

WERR    cre_mbf(W bufsz, W max, UW opt)

【パラメータ】

W       bufsz   メッセージバッファの全体のサイズ (バイト数)
W       max     メッセージ1つ当たりの最大サイズ (バイト数)
UW      opt     メッセージバッファ属性
        [ DELEXIT ]
        DELEXIT     生成プロセス終了時に自動削除

【リターン値】

>0   正常(メッセージバッファID)
<0   エラー(エラーコード)

【解説】

メッセージバッファを生成する。 生成したメッセージバッファは、すべてのプロセスから使用可能である。

bufsz / max 個のメッセージがメッセージバッファに入れられる ( 保存できる ) ことは保証されない。

bufsz に 0 を指定することができる。 この場合、メッセージはメッセージバッファに入らず ( 保存されず )、 送信側のタスクと受信側のタスクが同時に送信 / 受信を行うことになる(同期通信)。

【エラーコード】

ER_NOSPC    : システムのメモリ領域が不足した。
ER_LIMIT    : メッセージバッファの数がシステムの制限を超えた。
ER_PAR      : パラメータが不正である。
del_mbf
 
メッセージバッファの削除

【形式】

ERR del_mbf(ID id)

【パラメータ】

ID  id  メッセージバッファID

【リターン値】

=0  正常
<0  エラー(エラーコード)

【解説】

メッセージバッファを削除する。
削除したメッセージバッファで待ち状態にあったタスクは待ちが解除され、 そのタスクへ ER_DLT が返される。

【エラーコード】

ER_ID       : メッセージバッファIDが不正である。
ER_NOEXS    : メッセージバッファは存在していない。
snd_mbf
 
メッセージバッファへ送信

【形式】

ERR snd_mbf(ID id, VP msg, W sz, TMOUT tmo)

【パラメータ】

ID      id          メッセージバッファID
VP      msg         送信メッセージ
W       sz          送信メッセージサイズ (バイト数)
TMOOUT  tmo         タイムアウト指定 (ミリ秒)
        T_NOWAIT    送信できなくても待たない
        T_FOREVER   送信できるまで待つ
        >0          送信できるまで最長 tmo ミリ秒待つ

【リターン値】

=0  正常
<0  エラー(エラーコード)

【解説】

メッセージバッファへメッセージを送信する。 メッセージバッファに空きが足りない場合には、 空きができるまで待って送信する。 指定された待ち時間が経過しても送信できない場合には、 ER_NONE が返される。

メッセージバッファの生成時に指定したメッセージの最大サイズ ( max ) より大きなメッセージを送信することはできない。

【エラーコード】

ER_DLT      : メッセージバッファが待ちの間に削除された。
ER_ID       : メッセージバッファIDが不正である。
ER_MINTR    : メッセージハンドラが起動されたため待ち処理が中断された。
ER_NOEXS    : メッセージバッファは存在していない。
ER_NONE     : メッセージを送信できずにタイムアウトした。
ER_PAR      : パラメータが不正である。
rcv_mbf
 
メッセージバッファから受信

【形式】

WERR    rcv_mbf(ID id, VP msg, TMOUT tmo)

【パラメータ】

ID      id          メッセージバッファID
VP      msg         受信メッセージ
TMOUT   tmo         タイムアウト指定 (ミリ秒)
        T_NOWAIT    受信できなくても待たない
        T_FOREVER   受信できるまで待つ
        >0          受信できるまで最長 tmo ミリ秒待つ

【リターン値】

>0   正常(受信メッセージのバイト数)
<0   エラー(エラーコード)

【解説】

メッセージバッファからメッセージを受信し、 msg の領域に書き込む。 メッセージバッファにある先頭のメッセージが受信される。 メッセージバッファにメッセージがない場合には、 メッセージが送信されるまで待って受信する。 指定された待ち時間が経過しても受信できない場合には、 ER_NONE が返される。 msg には、 メッセージバッファの生成時に指定したメッセージ 1 つ当たりの最大サイズ ( max ) 以上の領域がなくてはいけない。

【エラーコード】

ER_DLT      : メッセージバッファが待ちの間に削除された。
ER_ID       : メッセージバッファIDが不正である。
ER_MINTR    : メッセージハンドラが起動されたため待ち処理が中断された。
ER_NOEXS    : メッセージバッファは存在していない。
ER_NONE     : メッセージを受信できずにタイムアウトした。
ER_PAR      : パラメータが不正である。
cre_por
 
ランデブポートの生成

【形式】

WERR    cre_por(W maxcmsz, W maxrmsz, UW opt)

【パラメータ】

W   maxcmsz 呼出メッセージ最大サイズ (バイト数)
W   maxrmsz 返答メッセージ最大サイズ (バイト数)
UW  opt     ランデブポート属性
            [ DELEXIT ]
            DELEXIT     生成プロセス終了時に自動削除

【リターン値】

>0   正常(ランデブポートID)
<0   エラー(エラーコード)

【解説】

ランデブポートを生成する。 生成したランデブポートは、すべてのプロセスから使用可能である。

【エラーコード】

ER_NOSPC    : システムのメモリ領域が不足した。
ER_LIMIT    : ランデブポートの数がシステムの制限を超えた。
ER_PAR      : パラメータが不正である。
del_por
 
ランデブポートの削除

【形式】

ERR del_por(ID id)

【パラメータ】

ID  id  ランデブポートID

【リターン値】

=0   正常
<0   エラー(エラーコード)

【解説】

ランデブポートを削除する。

削除したランデブポートで受け付け待ちまたは呼び出し待ちの状態にあったタスクは待ちが解除され、 そのタスクへ ER_DLT が返される。 ランデブ成立後にランデブポートが削除されても、 ランデブは成立したままであり、正常にランデブの返答ができる。

【エラーコード】

ER_ID       : ランデブポートIDが不正である。
ER_NOEXS    : ランデブポートは存在していない。
cal_por
 
ランデブ呼出

【形式】

WERR    cal_por(ID id, UW calptn, VP msg, W cmsz, TMOUT tmo)

【パラメータ】

ID      id          ランデブポートID
UW      calptn      呼出側選択条件 (>0)
VP      msg         呼出 / 返答メッセージ
W       cmsz        呼出メッセージサイズ (バイト数)
TMOUT   tmo         タイムアウト指定 (ミリ秒)
        T_NOWAIT    ランデブが成立しなくても待たない
        T_FOREVER   ランデブが成立するまで待つ
        >0          ランデブが成立するまで最長 tmo ミリ秒待つ

【リターン値】

>0   正常(返答メッセージのバイト数)
<0   エラー(エラーコード)

【解説】

ランデブ呼出を行う。 ランデブ受け付けタスクが存在し、 選択条件が満たされるとランデブ成立となる。 指定された待ち時間が経過してもランデブが成立しない場合には、 ER_NONE が返される。 ランデブ成立後は、ランデブの返答があるまで待つ。

ランデブは、次の選択条件が満たされると成立する。

( calptn & acpptn ) != 0    ∵ acpptn は、ランデブ受付側の選択条件

ランデブが成立すると、msg の内容がランデブ受付タスクへ送られる。 ランデブの返答が msg に格納され、 そのサイズが戻値に返される。

ランデブポートの生成時に指定した、 呼出メッセージの最大サイズ ( maxcmsz ) より大きなメッセージを送信することはできない。 また、サイズ 0 のメッセージを送信することもできない。

msg には、 ランデブポートの生成時に指定した返答メッセージの最大サイズ ( maxrmsz ) 以上の領域がなくてはならない。

【エラーコード】

ER_DLT      : ランデブポートがランデブ成立待ちの間に削除された。
ER_ID       : ランデブポートIDが不正である。
ER_MINTR    : メッセージハンドラが起動されたため待ち処理が中断された。
ER_NOEXS    : ランデブポートは存在していない。
ER_NONE     : ランデブが成立せずにタイムアウトした。
ER_PAR      : パラメータが不正である。
acp_por
 
ランデブ受付

【形式】

WERR    acp_por(ID id, UW acpptn, W *rdv, VP msg, TMOUT tmo)

【パラメータ】

ID      id          ランデブポートID
UW      acpptn      受付側選択条件 (>0)
W*      rdv         ランデブ番号
VP      msg         呼出メッセージ
TMOUT   tmo         タイムアウト指定 (ミリ秒)
        T_NOWAIT    ランデブが成立しなくても待たない
        T_FOREVER   ランデブが成立するまで待つ
        >0          ランデブが成立するまで最長 tmo ミリ秒待つ

【リターン値】

>0   正常(呼出メッセージのバイト数)
<0   エラー(エラーコード)

【解説】

ランデブを受け付ける。

ランデブ呼び出しタスクが存在し、 選択条件が満たされるとランデブ成立となる。 指定された待ち時間が経過してもランデブが成立しない場合には、 ER_NONE が返される。

ランデブは、次の選択条件が満たされると成立する。

( calptn & acpptn ) != 0    ∵ calptn は、ランデブ呼出側の選択条件

ランデブが成立すると、 そのランデブの識別番号が rdv に返される。 そして、呼び出しメッセージが msg に格納され、 そのサイズが戻値に返される。

msg には、 ランデブポートの生成時に指定した呼出メッセージの最大サイズ ( maxcmsz)以上の領域がなくてはならない。

【エラーコード】

ER_DLT      : ランデブポートがランデブ成立待ちの間に削除された。
ER_ID       : ランデブポートIDが不正である。
ER_MINTR    : メッセージハンドラが起動されたため待ち処理が中断された。
ER_NOEXS    : ランデブポートは存在していない。
ER_NONE     : ランデブが成立せずにタイムアウトした。
ER_PAR      : パラメータが不正である。
fwd_por
 
ランデブ回送

【形式】

ERR fwd_por(ID id, UW calptn, W rdv, VP msg, W cmsz)

【パラメータ】

ID  id      ランデブポートID
UW  calptn  呼出側選択条件 (>0)
W   rdv     ランデブ番号
VP  msg     呼出メッセージ
W   cmsz    呼出メッセージサイズ (バイト数)

【リターン値】

=0  正常
<0  エラー(エラーコード)

【解説】

一旦受け付けたランデブを回送する。

現在のランデブ相手 ( 呼出タスク ) と自タスクの間で成立しているランデブを解除し、 呼出タスクが新たに回送先のポートに対してランデブ呼出を行う。 回送先のポートに対するランデブ呼出が成立しない場合には、 呼出タスクがランデブ成立待ちの状態になる。 呼出タスクの待ちは、cal_por() で指定したタイムアウト指定に関係なく無限待ち ( T_FOREVER ) となる。自タスクは待ちに入らない。

呼出タスクのランデブは、 fwd_por() で指定された条件で行われる。 つまり、fwd_por() で指定された calptn により選択条件が満たされるとランデブが成立する。

回送先のランデブポートの生成時に指定した、 呼出メッセージの最大サイズ ( maxcmsz ) より大きなメッセージを送信することはできない。 また、サイズ 0 のメッセージを送信することもできない。

回送先のランデブポートの返答メッセージの最大サイズ ( maxrmsz ) は、 回送前の成立していたランデブポートの返答メッセージの最大サイズより大きくてはいけない ( ER_OBJ)。 また、回送の呼出メッセージサイズ ( cmsz ) も回送前のランデブポートの返答メッセージの最大サイズより大きくてはいけない ( ER_PAR)。

【エラーコード】

ER_ID       : ランデブポートIDが不正である。
ER_NOEXS    : ランデブポートは存在していない。
ER_OBJ      : 回送先のランデブポートの返答メッセージの最大サイズより、
              回送前のランデブポートの返答メッセージの最大サイズの方が小さい。
            : ランデブ番号が不正である。
ER_PAR      : パラメータが不正である。
rpl_rdv
 
ランデブ返答

【形式】

ERR rpl_rdv(W rdv, VP msg, W rmsz)

【パラメータ】

W   rdv     ランデブ番号
VP  msg     返答メッセージ
W   rmsz    返答メッセージサイズ (バイト数)

【リターン値】

=0  正常
<0  エラー(エラーコード)

【解説】

ランデブ相手のタスクに返答し、ランデブを終了する。

ランデブを受け付けたランデブポートを生成したときに指定した、 応答メッセージの最大サイズ ( maxrmsz ) より大きなメッセージを返答することはできない。 また、サイズ 0 のメッセージを返答することもできない。

【エラーコード】

ER_OBJ      : ランデブ番号が不正である。
ER_PAR      : パラメータが不正である。

この章の目次にもどる
前頁:1.2 メッセージ管理にもどる
次頁:1.4 グローバル名管理にすすむ