Windows版iTRONサービスコールの作成 (可変長メモリプール)
(その3)
可変長メモリプールを削除するサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
del_mpl | 可変長メモリプールを削除します。 |
※ Ver3.0、Ver4.0共に同じサービスコールの形式です。
可変長メモリプールを削除するには以下のサービスコールを使用します。
ER del_mpl( ID mplid )
引数 | 説明 |
---|---|
mplid | メモリプールID番号。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のメモリプールID番号。 |
E_NOEXS | 指定したメモリプールID番号は登録されていない。 |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief 可変長メモリプールの削除.
*
* @param [in] mpfid メモリ・プールID番号.
*
* @retval エラーコード.
*/
ER del_mpl( ID mplid )
{
ER ercd;
wi_CommonLock();
//! 可変長メモリプールを削除する.
ercd = wi_DeleteVarMemPool( mplid );
wi_CommonUnlock();
return ercd;
}
削除するメモリプールのID番号を引数として可変長メモリプール削除関数を呼び出します。
可変長メモリプール削除関数
可変長メモリプール削除関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief 可変長メモリプールの削除.
*
* @param [in] id メモリプールID番号.
*
* @retval エラーコード.
*/
ER wi_DeleteVarMemPool( INT id )
{
ER ercd;
WIMPLOBJ *p;
//! メモリプールIDのオブジェクトを取得する.
p = (WIMPLOBJ *)wi_FindObject( id, TMAX_MAXMPL, ObjList, &ercd );
if( !p ){
return ercd;
}
//! リストから該当するメモリプールを取り除く.
wi_DelObject( (WIHDR *)p, &ObjList );
//! 待ちタスクキューを解放する.
wi_WakeupDelResource( p->WaitQue );
//! メモリプールのバッファを解放する.
SAFE_RELEASE( p->MemBuf );
//! 可変長メモリプール・オブジェクト構造体を解放する.
SAFE_RELEASE( p );
return E_OK;
}
可変長メモリプール削除関数は以下のような処理を行います。
- 引数で指定された可変長メモリプールID番号に該当する可変長メモリプール・オブジェクトを取り出します。
- 可変長メモリプール・オブジェクトのリストから削除するオブジェクトを外します。
- 次に削除する可変長メモリプールのメモリ解放待ちをしているタスクを全て起床させます。
- 可変長メモリプールのメモリバッファを解放します。
- 可変長メモリプール・オブジェクトのために確保したメモリを解放して処理を終了します。