/*	
 *	cliptask.h
 *
 *	タスク制御 (ガーベージコレクター必須!!)
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2004 Naoyuki Sawa
 *
 *	* Mon Jul 05 05:31:56 JST 2004 Naoyuki Sawa
 *	- 作成開始。
 *	  GCを使わないタスク制御は、keepフォルダに保存しました。
 */
#ifndef __CLIP_TASK_H__
#define __CLIP_TASK_H__

/*****************************************************************************
 *	
 *****************************************************************************/

/* アプリケーション定義のタスクイベント処理関数プロトタイプです。
 * [in]
 *	data		タスクデータ領域へのポインタ。
 *	code		アプリケーション定義のイベントコード。
 *	param		アプリケーション定義のイベントパラメータ。
 */
typedef void TASKEVENTHANDLER(void* data, int code, void* param);

/*
 *	共通タスクヘッダ (タスクリストのノードを表します)
 */
typedef struct _TASK {
	TASKEVENTHANDLER* event_handler;	/* タスクイベント処理関数 (NULL:停止) */
	struct _TASK* next_task;		/* 次のタスクへのポインタ (NULL:終端) */
} TASK;
/* 共通タスクヘッダの直後に、アプリケーション定義のタスクデータ領域が続きます。 */

/* 新しいタスクを作成し、タスクリストに追加ます。
 * [in]
 *	task_list	タスクリスト先頭へのポインタのポインタ。
 *			必要に応じて、タスクリスト先頭ポインタを更新します。
 *	event_handler	アプリケーション定義のタスクイベント処理関数。
 *			NULLを指定することはできません。
 *	data_size	タスクデータ領域のバイト数。
 *			タスクデータ領域が必要ない場合は、0を指定してください。
 * [out]
 *	戻り値		タスクデータ領域へのポインタ。
 *			data_sizeに0を指定した場合も、0バイト領域への有効なポインタです。
 * [note]
 *	* タスクデータ領域は初期状態でゼロクリアされています。
 *	  アプリケーションから明示的にゼロクリアする必要はありません。
 */
void* task_start(TASK** task_list, TASKEVENTHANDLER* event_handler, int data_size);

/* タスクを停止します。
 * [in]
 *	data		タスクデータ領域へのポインタ。
 */
void task_stop(void* data);

/* タスクイベント処理関数を呼び出します。
 * [in]
 *	task_list	タスクリスト先頭へのポインタのポインタ。
 *			必要に応じて、タスクリスト先頭ポインタを更新します。
 *	code		アプリケーション定義のイベントコード。
 *	param		アプリケーション定義のイベントパラメータ。
 */
void task_event(TASK** task_list, int code, void* param);

#endif /*__CLIP_TASK_H__*/
