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

ミューテックスのロックを解除する

ミューテックスのロックを解除するサービスコールは以下のとおりです。


サービスコール名説明
unl_mtx

ミューテックスのロックを解除します。

ミューテックスのロックを解除する

ミューテックスのロックを解除するには以下のサービスコールを使用します。



    ER unl_mtx( ID mtxid )
	

引数説明
mtxid

ミューテックスID番号。

戻り値説明
E_OK

正常終了。

E_ID

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

E_NOEXS

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

E_ILUSE

ミューテックスをロックしたタスク以外からの呼び出し。


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


/****************************************************************************/
/*!
 *  @brief  ミューテックスのロックを解除.
 *
 *  @param  [in]    mtxid   ミューテックスID番号.
 *
 *  @retval エラーコード.
 */
ER      unl_mtx( ID mtxid )
{
    ER ercd;

    wi_CommonLock();

    //! ミューテックスのロックを解除する.
    ercd = wi_UnlockMutex( mtxid );

    wi_CommonUnlock();
    return ercd;
}
	

指定したミューテックスID番号を引数としてミューテックスのロック解除関数を呼び出します。

ミューテックスのロック解除関数

ミューテックスのロック解除関数のソースコードは以下のとおりです。



/****************************************************************************/
/*!
 *  @brief  ミューテックスのロックを解除する.
 *
 *  @param  [in]    id      ミューテックスID番号.
 *
 *  @retval エラーコード.
 */
ER      wi_UnlockMutex( INT id )
{
    ER          ercd;
    WIMTXOBJ    *p;

    //! ミューテックスIDのオブジェクトを取得する.
    p = (WIMTXOBJ *)wi_FindObject( id, TMAX_MAXMTX, ObjList, &ercd );
    if( !p ){
        return ercd;
    }
    //! ミューテックスをロックしているタスクと違う場合はエラーにする.
    if( p->LockId != wi_GetActiveTaskId() ){
        return E_ILUSE;
    }
    p->LockId = 0;

    //! ロック解除待ちをしているタスクがある場合はタスクを起床させる.
    if( p->WaitQue ){
        wi_TaskWakeup( p->WaitQue->Id, TTW_MTX, &(p->WaitQue) );
    }
    return E_OK;
}
	

ミューテックスのロック解除関数は以下のような処理を行います。

  • 引数で指定されたミューテックスID番号に該当するミューテックス・オブジェクトを取り出します。
  • ミューテックスをロックしたタスク以外のタスクから呼び出された場合はエラー終了にします。
  • ミューテックスのロックをかけたタスクのID番号をクリアしてロックを解除します。
  • ロック解除待ちのタスクがある場合は、待ち行列の先頭のタスクを起床させます。


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