コード例 #1
0
ファイル: task_manage.c プロジェクト: Ashatta/tools
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();
}
コード例 #2
0
ファイル: exit.c プロジェクト: bingone/fuckOS
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;
}