/* mytt.h * スレッドテーブルのサンプル * ・保持するスレッド数の上限を設定。 */ #ifndef _MYTT_H_ #define _MYTT_H_ #ifndef APR_GENERAL_H #include "apr_general.h" #endif #ifndef APR_ERRNO_H #include "apr_errno.h" #endif #ifndef APR_THREAD_PROC_H #include "apr_thread_proc.h" #endif /* * スレッドテーブル * ・スレッドテーブルは処理中のサブスレッドのスレッドハンドルを保持する配列。 * ・インデクス変数で次の位置をポイントする。 * 条件: * ・スレッドテーブルはメインスレッドでのみ操作する。 * ・スレッドテーブルはサブスレッドから操作してはならない。 * ルール: * (1)arr[i]==NULL の時、arr[i] はサブスレッドを保持していない。 * また、過去にサブスレッドを保持していた場合は同期済である。 * (2)arr[i]!=NULL の時、arr[i] は同期前のサブスレッドを保持している。 */ typedef struct _my_thread_table_st { apr_pool_t *pool; /* メモリプール */ int num; /* スレッドテーブルのサイズ */ int index; /* スレッドテーブルのインデクス変数 */ apr_thread_t **arr; /* スレッドテーブル(スレッドハンドルの配列) */ apr_threadattr_t *attr; /* デフォルトのスレッド属性 */ } my_thread_table; /* 【必須】スレッドテーブルの初期化 * ・必ずメインスレッドの最初に呼ぶこと。 */ void my_thread_table_init( my_thread_table *mtt /* IN/OUT: スレッドテーブル(呼び出し元で領域確保する) */ ,int num /* IN:スレッドテーブルのサイズ */ , apr_pool_t *pool /* OUT:メモリプール */ ); /* スレッドの生成 * 返り値: * 成功時には APR_SUCCESS。 */ apr_status_t my_thread_create ( my_thread_table *mtt /* IN:スレッドテーブル */ , apr_thread_t **thd /* OUT:生成したサブスレッドのスレッドハンドル */ , apr_thread_start_t func /* IN:サブスレッドが処理する関数 */ , void *data /* IN:サブスレッドが処理する関数で使うデータ */ ); /* 【必須】スレッドテーブルのリセット * ・スレッドテーブルが保持する全サブスレッドの同期をしてからスレッドテーブルをリセットする。 * ・メインスレッドで最後に必ず呼ぶこと。 * 返り値: * 成功時には APR_SUCCESS。 */ apr_status_t my_thread_table_clear ( my_thread_table *mtt /* IN:スレッドテーブル */ ); #endif /* _MYTT_H_ */