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

📄 thread.c

📁 国内一位牛人自己开发的操作系统
💻 C
字号:
#include"kernel.h"

#define WRONG_THREAD_ID 	-1
#define WRONG_CAPABILITY 	-2
#define WRONG_STACK_TOP 	-3
#define WRONG_INTERRUPT_NUMBER 	-4
#define WRONG_FUNCTION_NUMBER	-5
#define WRONG_PROCESS_NUMBER	-6
#define WRONG_STACK_NUMBER	-7
#define WRONG_THREAD_STATE	-8
#define SET_RETURN_NUMBER_FAIL	-9

int set_thread_attribute(int semaphore_id,
	struct exception_item *exception,
	int *priority,int *mandatory_exit_number,
	struct capability *current_process_capability)
{
	int i,thread_id,return_value;
	struct thread *t;
	struct return_stack *rt;
	if((semaphore_id<=0)||(semaphore_id>=SEMAPHORE_NUMBER))
		return WRONG_THREAD_ID;
	thread_id=os->semaphore[semaphore_id].thread_id;
	if((thread_id<0)||(thread_id>=THREAD_NUMBER))
		return WRONG_THREAD_ID;
	t=&(os->thread[thread_id]);
	rt=&(t->return_stack[t->return_stack_top-1]);
	if(!KERNEL_COMPARE_CAPABILITY(
		(os->process[rt->current_process].capability),
		(*current_process_capability)))
			return WRONG_CAPABILITY;
	if(!KERNEL_COMPARE_CAPABILITY((os->system_capability),
		(*current_process_capability)))
	if(*priority<os->process[rt->current_process].priority)
		*priority=os->process[rt->current_process].priority;
	if(!exception->flag)
		COPY_EXCEPTION_ITEM((*exception),(rt->exception));
	*priority=t->priority;
	modify_thread_priority(thread_id,*priority);

	if((*mandatory_exit_number)<=0){
		*mandatory_exit_number=0;
		return 0;
	}
	if(t->state==SLEEP)
		v_thread(thread_id);
	for(i=0;i<*mandatory_exit_number;i++){
		rt=&(t->return_stack[t->return_stack_top-1]);
		if(!KERNEL_COMPARE_CAPABILITY(
			(os->process[rt->current_process].capability),
			(*current_process_capability)))
				break;
		if((return_value=thread_return(thread_id,FALSE))<0)
			return return_value;
		if(t->state==SLEEP)
			break;
	}
	*mandatory_exit_number=i;
	return i;
}

int get_thread_attribute(int semaphore_id,
	struct exception_item *exception,int *priority,
	int *return_stack_top,int *process,int *current_process,
	struct capability *current_process_capability)
{
	int thread_id;
	struct thread *t;
	struct return_stack *rt;
	struct capability  *cap;

	if((semaphore_id<=0)||(semaphore_id>=SEMAPHORE_NUMBER))
		return WRONG_THREAD_ID;
	thread_id=os->semaphore[semaphore_id].thread_id;
	if((thread_id<0)||(thread_id>=THREAD_NUMBER))
		return WRONG_THREAD_ID;
	t=&(os->thread[thread_id]);
	rt=&(t->return_stack[t->return_stack_top-1]);
	cap=&(os->process[rt->current_process].capability);
	if(!KERNEL_COMPARE_CAPABILITY(
			(*cap),(*current_process_capability)))
		return WRONG_CAPABILITY;
	*priority=t->priority;

	COPY_EXCEPTION_ITEM((rt->exception),(*exception));
	*return_stack_top=t->return_stack_top;
	*process=t->process;
	*current_process=rt->current_process;
	return 0;
}

⌨️ 快捷键说明

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