/*	
 *	cliptask.h
 *
 *	タスクコントローラを定義します。
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001 Naoyuki Sawa
 *
 *	* Fri Nov 30 14:14:09 JST 2001 Naoyuki Sawa
 *	- 作成開始。
 *	* Fri Nov 30 16:31:29 JST 2001 Naoyuki Sawa
 *	- 1stリリース。
 */
#ifndef __CLIP_TASK_H__
#define __CLIP_TASK_H__

/*****************************************************************************
 *	TASK
 *****************************************************************************/

typedef struct _TASK TASK;

/* タスクハンドラのプロトタイプです。
 */
typedef void (*TASKFREEPROC)(TASK* task);	/* Freeハンドラ */
typedef int  (*TASKWORKPROC)(TASK* task);	/* Workハンドラ */
typedef void (*TASKDRAWPROC)(TASK* task);	/* Drawハンドラ */

/* ユーザー定義タスクの共通ヘッダです。
 */
struct _TASK {
	int suspend;		/* サスペンドカウンタ
				 *  1以上: サスペンド(自動レジュームあり)
				 *  0    : 通常の状態
				 * -1以下: サスペンド(自動レジュームなし)
				 */

	TASK* parent;		/* 親タスク(NULL:トップレベル) */
	TASK* siblings;		/* 次の兄弟タスク(NULL:終端) */
	TASK* children;		/* 最初の子タスク(NULL:なし) */

	TASKFREEPROC free;	/* Freeハンドラ(NULL:なし) */
	TASKWORKPROC work;	/* Workハンドラ(NULL:なし) */
	TASKDRAWPROC draw;	/* Drawハンドラ(NULL:なし) */
};

/* タスクを作成します。
 * [in]
 *	parent		親タスクへのポインタ。
 *			NULLを指定すると、トップレベルタスクとなります。
 *	data_size	データ領域のバイト数。
 * [out]
 *	戻り値		作成したタスクへのポインタ。
 *			メモリが確保できなければ、NULLを返します。
 */
TASK* task_new(TASK* parent, int data_size);

/* タスクを開放します。
 * [in]
 *	task		タスクへのポインタ。
 */
void task_free(TASK* task);

/* 全ての子タスクを開放します。
 * [in]
 *	task		タスクへのポインタ。
 */
void task_clear(TASK* task);

/* Workハンドラを呼び出します。
 * [in]
 *	task		タスクへのポインタ。
 * [note]
 *	戻り値		Workハンドラが0を返したら、
 *			タスクを開放して、この関数も0を返します。
 *			Workハンドラが0以外の値を返したら、
 *			タスクを開放せず、この関数も0以外の値を返します。
 */
int task_work(TASK* task);

/* Drawハンドラを呼び出します。
 * [in]
 *	task		タスクへのポインタ。
 */
void task_draw(TASK* task);

/* タスクリストに含まれるタスクの数を数えます。
 * [in]
 *	task		タスクへのポインタ。
 * [out]
 *	戻り値		タスクの数
 * [note]
 *	* タスクの数には、引数に指定したtask自身も含まれます。
 *	  従って、taskがNULLでない限り、戻り値は1以上になります。
 *	  taskにNULLを指定した場合のみ、戻り値は0になります。
 */
int task_count(TASK* task);

#endif /*__CLIP_TASK_H__*/

