void kz_start(kz_func_t func, char *name, int priority, int stacksize, int argc, char *argv[]) { kzmem_init(); /* 動的メモリの初期化 */ /* * 以降で呼び出すスレッド関連のライブラリ関数の内部で current を * 見ている場合があるので,current を NULL に初期化しておく. */ current = NULL; memset(readyque, 0, sizeof(readyque)); memset(threads, 0, sizeof(threads)); memset(handlers, 0, sizeof(handlers)); memset(msgboxes, 0, sizeof(msgboxes)); /* 割込みハンドラの登録 */ thread_setintr(SOFTVEC_TYPE_SYSCALL, syscall_intr); /* システム・コール */ thread_setintr(SOFTVEC_TYPE_SOFTERR, softerr_intr); /* ダウン要因発生 */ /* システム・コール発行不可なので直接関数を呼び出してスレッド作成する */ current = (kz_thread *)thread_run(func, name, priority, stacksize, argc, argv); /* 最初のスレッドを起動 */ dispatch(¤t->context); /* ここには返ってこない */ }
/* 初期スレッドの起動 */ void kz_start(kz_func_t func, char *name, int priority, int stacksize, int argc, char *argv[]) { /* 動的メモリの初期化 */ kzmem_init(); /* * 以降で呼び出すスレッド関連のライブラリ関数の内部で * current を見ている場合があるので、currentをNULLに初期化しておく */ current = NULL; memset(readyque, 0, sizeof(readyque)); memset(threads, 0, sizeof(threads)); memset(handlers, 0, sizeof(handlers)); memset(msgboxes, 0, sizeof(msgboxes)); setintr(SOFTVEC_TYPE_SYSCALL, syscall_intr); setintr(SOFTVEC_TYPE_SOFTERR, softerr_intr); /* * システムコール発行不可なので直接関数を呼び出してスレッド作成する */ current = (kz_thread *)thread_run(func, name, priority, stacksize, argc, argv); /* * 渡されたスタックポインタをもとに実行される=上で登録したcurrentが実行される */ dispatch(¤t->context); /* ここには返ってこない */ }
void kz_start(kz_func_t func, char *name, int priority, int stacksize, int argc, char *argv[]) { kzmem_init(); current = NULL; memset(readyque, 0, sizeof(readyque)); memset(threads, 0, sizeof(threads)); memset(handlers, 0, sizeof(handlers)); memset(msgboxes, 0, sizeof(msgboxes)); setintr(SOFTVEC_TYPE_SYSCALL, syscall_intr); setintr(SOFTVEC_TYPE_SOFTERR, softerr_intr); current = (kz_thread *)thread_run(func, name, priority, stacksize, argc, argv); dispatch(¤t->context); }