SYSCALL void ext_tsk(void) { LOG_EXT_TSK_ENTER(); #ifdef ACTIVATED_STACK_SIZE /* * create_context と activate_context で,使用中のスタック領 * 域を破壊しないように,スタック上にダミー領域を確保する. */ (void) alloca(ACTIVATED_STACK_SIZE); #endif /* ACTIVATED_STACK_SIZE */ if (sense_context()) { /* * 非タスクコンテキストから ext_tsk が呼ばれた場合, * システムログにエラーを記録し,そのまま実行を続ける * が, 動作は保証されない. */ syslog_0(LOG_EMERG, "ext_tsk is called from non-task contexts."); } if (sense_lock()) { /* * CPUロック状態で ext_tsk が呼ばれた場合は,CPUロック * を解除してからタスクを終了する.実装上は,サービス * コール内でのCPUロックを省略すればよいだけ. */ syslog_0(LOG_WARNING, "ext_tsk is called from CPU locked state."); } else { if (sense_context()) { i_lock_cpu(); } else { t_lock_cpu(); } } if (!(enadsp)) { /* * ディスパッチ禁止状態で ext_tsk が呼ばれた場合は, * ディスパッチ許可状態にしてからタスクを終了する. */ syslog_0(LOG_WARNING, "ext_tsk is called from dispatch disabled state."); enadsp = TRUE; } exit_task(); }
int exit(struct task_struct *task) { assert(task); if (task == curtask) lcr3(pgd2p(kpgd)); schedule_delete_task(task); exit_notify(task); exit_mm(task->mm); exit_files(task); exit_task(task); if (task == curtask) { curtask = NULL; schedule(); } return 0; }