⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 create.c

📁 国内一位牛人自己开发的操作系统
💻 C
字号:

#include "kernel.h"

#define  WRONG_THREAD_ID		(-2)
#define  WRONG_PROCESS_NUMBER 		(-3)
#define  WRONG_CAPABILITY 		(-4)
#define  CREATE_TOO_MANY_THREAD 	(-5)
#define  NO_THREAD_TO_CREATE 		(-6)
#define  WRONG_STACK_TOP		(-7)
#define  EMPTY_RETURN_STACK		(-8)
#define  NOT_SEMAPHORE_FOR_CREATE	(-9)

int create_thread(
	struct user_file_information *file_info,
	int process_id,int current_process,int priority,
	struct thread_environment *thread_environment,
	struct capability *process_capability)
{
	int i,thread_id;
	struct process *process;
	struct thread *t;
	struct return_stack *rt;

	if((process_id<=0)||(process_id>=PROCESS_NUMBER))
		return WRONG_PROCESS_NUMBER;
	process=&(os->process[process_id]);
	if(!KERNEL_COMPARE_CAPABILITY(
		process->capability,(*process_capability)))
			return WRONG_CAPABILITY;
	if(process->thread_number>=process->max_thread_number)
		return CREATE_TOO_MANY_THREAD;

	if((thread_id=os->process[0].thread_ring)<0)
		return NO_THREAD_TO_CREATE;
	process->thread_number++;
	os->process[0].thread_number--;
	t=&(os->thread[thread_id]);
	t->process=process_id;
	
	if(t->pro_front==thread_id)
		os->process[0].thread_ring=-1;
	else{
		os->process[0].thread_ring=t->pro_back;
		os->thread[t->pro_front].pro_back=t->pro_back;
		os->thread[t->pro_back].pro_front=t->pro_front;
	}

	if(process->thread_ring<0){
			t->pro_front=thread_id;
			t->pro_back=thread_id;
			process->thread_ring=thread_id;
		}
	else{
		int front_thread,back_thread;
		front_thread=process->thread_ring;
		back_thread=os->thread[front_thread].pro_back;
		os->thread[front_thread].pro_back=thread_id;
		os->thread[back_thread].pro_front=thread_id;
		os->thread[thread_id].pro_front=front_thread;
		os->thread[thread_id].pro_back=back_thread;
	}

	t->return_stack_top=1;
	rt=&(t->return_stack[0]);

	COPY_THREAD_ENVIRONMENT((*thread_environment),
		(rt->environment));
	COPY_RUN_POINT((thread_environment->point),
		(rt->environment.point));
	RESET_THREAD_PARAMETER(rt->environment);
	rt->current_process=current_process;
	RESET_EXCEPTION_ITEM(rt->exception);
	rt->physical_block.memory_id=-1;
	rt->physical_block.stack_block_id=-1;
	rt->physical_block.block_id=-1;
	
	t->priority=priority;
	t->set_v_operation_result_flag=FALSE;
	os->semaphore[0].value=(-THREAD_NUMBER);
	v_thread(thread_id);
	t->semaphore=allocate_semaphore(t->process,0,
		&(os->process[t->process].capability),
		&(os->process[rt->current_process].capability));
	if(t->semaphore<=0){
		thread_return(thread_id,FALSE);
		return NOT_SEMAPHORE_FOR_CREATE;
	}
	os->semaphore[t->semaphore].thread_id=thread_id;

	thread_environment->system_call=t->semaphore;
	thread_environment->system_call_arg1=0;

	rt->environment.system_call=t->semaphore;
	rt->environment.system_call_arg1=1;
	rt->process_p_flag=TRUE;

	for(i=0;i<USER_FILE_NUMBER;i++,file_info++)
		COPY_USER_FILE_INFORMATION((*file_info),(t->file[i]));
	return t->semaphore;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -