Windows版iTRONサービスコールの作成 (タスク管理)
(その3)

タスクを削除する

タスクを削除するサービスコールは以下のとおりです。


サービスコール名説明
del_tsk

タスク・オブジェクトをシステムから削除します。

※ Ver3.0、Ver4.0共に同じサービスコールの形式です。

タスクを削除する

タスクを削除するには以下のサービスコールを使用します。



    ER del_tsk( ID tskid )
	

引数説明
tskid

タスクID番号。

戻り値説明
E_OK

正常終了。

E_ID

範囲外のタスクID番号。

E_NOEXS

指定したタスクID番号のタスクが未登録。

E_OBJ

タスクの状態が「休止中」以外。


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


/****************************************************************************/
/*!
 *  @brief  タスクの削除.
 *
 *  @param  [in]    tskid   タスクID番号.
 *
 *  @retval エラーコード.
 */
ER      del_tsk( ID tskid )
{
    ER ercd;

    wi_CommonLock();

    //! タスクを削除する.
    ercd = wi_DeleteTask( tskid );

    wi_CommonUnlock();
    return ercd;
}
	

削除するタスクのID番号を引数としてタスク削除関数を呼び出します。

タスク削除関数

タスクの削除を行う関数のソースコードは以下のとおりです。


/****************************************************************************/
/*!
 *  @brief  タスクの削除.
 *
 *  @param  [in]    id      タスクID番号.
 *
 *  @retval エラーコード.
 */
ER      wi_DeleteTask( INT id )
{
    WITSKOBJ    *p      = (WITSKOBJ *)ObjList;
    WIHDR       **b_ptr = &ObjList;

    //! 自タスクは削除できない.
    if( id == TSK_SELF ){
        return E_OBJ;
    }
    //! 不正なタスクIDの場合はエラーにする.
    if( id >= TMAX_MAXTSK ){
        return E_ID;
    }
    while( p ){
        //! 指定されたIDと一致するタスクを見つけた場合、タスクをクローズする.
        if( p->Hdr.Id == id ){

            //! スレッドが休止状態でない場合は削除しない.
            if( p->TaskState != TTS_DMT ){
                return E_OBJ;
            }
            //! リストから該当するタスクを取り除く.
            *b_ptr = (WIHDR *)(p->Hdr.Next);

            if( p->hThread ){
                //! スレッドが停止していることを確認する.
                wi_DormantThread( p->hThread, 10 );

                //! スレッド・ハンドルを解放する.
                CloseHandle( p->hThread );
                 p->hThread = NULL;
            }
            //! イベント・ハンドルを解放する.
            if( p->hEvent ){
                CloseHandle( p->hEvent );
                p->hEvent = NULL;
            }
            //! 待ち行列からタスクを削除する.
            wi_AllReleaseSemaphore( id );
            wi_AllReleaseEvFlag( id );
            wi_AllReleaseMailBox( id );
            wi_AllReleaseDataQueue( id );
            wi_AllReleaseMutex( id );
            wi_AllReleaseMsgBuffer( id );
            wi_AllReleaseRendPort( id );

            //! メモリプールから獲得したメモリブロックを返却する.
            wi_AllReleaseFixedMemPool( id );
            wi_AllReleaseVarMemPool( id );

            //! タスク構造体を解放する.
            SAFE_RELEASE( p );
            return E_OK;
        }
        //! リストから次のタスクを取り出す.
        b_ptr = &(p->Hdr.Next);
        p     = (WITSKOBJ *)(p->Hdr.Next);
    }
    return E_NOEXS;
}
	

タスクの削除を行う関数は以下のような処理を行います。

  • 削除するタスクID番号が1~TMAX_MAXTSK の範囲内かどうかをチェックします。
  • タスク・オブジェクトのリストを先頭から検索して、削除するタスクID番号と一致するタスク・オブジェクトのポインタを取り出します。
  • 削除するタスクが『休止中』以外の場合、タスクの削除は行わずに処理を終了します。
  • タスク・オブジェクトのリストから削除するオブジェクトを外します。
  • スレッドを生成している場合、スレッドの停止を確認してスレッド・ハンドルを解放します。
  • イベント・ハンドルを解放します。
  • 同期オブジェクトの待ち行列から削除するタスクを外します。
  • メモリプールから獲得したメモリブロックを全て返却します。
  • タスク・オブジェクトのために確保したメモリを解放して処理を終了します。


商標に関する表示