Windows版 iTRONサービスコールの作成 (ミューテックス)
(その6)

ミューテックスの状態を参照する

ミューテックスの状態を参照するサービスコールは以下のとおりです。


サービスコール名説明
ref_mtx

ミューテックスの状態を取得します。

ミューテックスの状態を取得する

ミューテックスの状態を取得するには以下のサービスコールを使用します。



    ER ref_mtx( ID mtxid, T_RMTX *pk_rmtx )
	

引数説明
mtxid

ミューテックスID番号。

pk_rmtx

ミューテックス状態を格納する構造体のポインタ。

戻り値説明
E_OK

正常終了。

E_ID

範囲外のミューテックスID番号。

E_NOEXS

指定したミューテックスID番号は登録されていない。

E_PAR

パラメータエラー。


ミューテックス状態を格納する構造体(T_RMTX)は以下のとおりです。

メンバ名説明
htskidミューテックスをロックしているタスクのID番号。
wtskidミューテックス待ち行列の先頭のタスクID番号。


・サービスコールのソースコードは以下のようになります。


/****************************************************************************/
/*!
 *  @brief  ミューテックスの状態参照.
 *
 *  @param  [in]    mtxid   ミューテックスID番号.
 *  @param  [out]   pk_rmbx ミューテックス状態を格納する構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      ref_mtx( ID mtxid, T_RMTX *pk_rmtx )
{
    ER          ercd;
    WIMTXSTAT   sts;

    //! 引数が不正な場合はエラーにする.
    if( !pk_rmtx ){
        return E_PAR;
    }
    wi_CommonLock();

    //! ミューテックスの状態を取得する.
    ercd = wi_RefarenceMutex( mtxid, &sts );
    if( ercd == E_OK ){
        pk_rmtx->htskid = sts.LockId;
        pk_rmtx->wtskid = sts.WaitId;
    }
    wi_CommonUnlock();
    return E_OK;
}
	

ミューテックス状態を格納する構造体のポインタがNULLの場合エラーにします。

ミューテックス状態を取得する関数を呼び出して現在のミューテックスの状態を取得し引数の構造体に格納します。

ミューテックス状態取得関数

ミューテックス状態を取得する関数のソースコードは以下のとおりです。



/****************************************************************************/
/*!
 *  @brief  ミューテックスの状態参照.
 *
 *  @param  [in]    id      ミューテックスID番号.
 *  @param  [in]    sts     ミューテックス状態を格納する構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      wi_RefarenceMutex( INT id, WIMTXSTAT *sts )
{
    ER          ercd;
    WIMTXOBJ    *p;

    //! ミューテックスIDのオブジェクトを取得する.
    p = (WIMTXOBJ *)wi_FindObject( id, TMAX_MAXMTX, ObjList, &ercd );
    if( !p ){
        return ercd;
    }
    //! ミューテックスの状態を構造体にセットする.
    sts->LockId = p->LockId;
    sts->WaitId = wi_GetWaitTaskListFirstId( p->WaitQue );
    return E_OK;
}
	

ミューテックス状態を取得する関数は以下のような処理を行います。

  • 引数で指定されたミューテックスID番号に該当するミューテックス・オブジェクトを取り出します。
  • ミューテックスをロックしているタスクのID番号を引数の構造体にセットします。
  • ロック解除待ちをしているタスクの待ち行列から先頭のタスクのID番号を取り出して、引数の構造体にセットします。


Windowsは米国Microsoft Corporationの登録商標です。