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

📄 file.c

📁 虚拟地址空间基于文件的操作系统
💻 C
字号:
#include "memory.h"

#define WRONG_MEMORY_BODY_ID		-1
#define WRONG_MEMORY_PROCESS_ID		-2
#define WRONG_CAPABILITY		-4
#define OPEN_TOO_MANY_FILE		-5
#define NO_FILE_TO_OPEN			-6
#define WRONG_FILE_NUMBER		-7
#define WRONG_FILE_STATE		-8
#define EXIST_BLOCK			-9
#define FILE_IS_LOCKED			-10
#define CAN_NOT_SET_FILE_CAPABILITY	-11
#define WRONG_FILE_WINDOW_ID		-12
#define FILE_ALREADY_OPEN		-13
	
int open_file_window(int file_window_id,
	struct file_window *file_window,
	struct capability *process_capability)
{
	int file_id,process_number;
	int file_front,file_back;
	struct memory_process *p;
	struct file_window *f;

	process_number=(*(memory_body->process_number));

	if(file_window->file.memory_process<0)
		return WRONG_MEMORY_PROCESS_ID;

	if(file_window->file.memory_process>=process_number)
		return WRONG_MEMORY_PROCESS_ID;

	p=memory_body->memory_process;
	p=p+(file_window->file.memory_process);

	if(!KERNEL_COMPARE_CAPABILITY(
			(p->capability),(*process_capability)))
		return WRONG_CAPABILITY;
	if(p->file_number>=p->max_file_number)
		return OPEN_TOO_MANY_FILE;
	if(file_window_id>=(*(memory_body->file_number)))
		return WRONG_FILE_WINDOW_ID;
	if(file_window_id>=0){
			f=memory_body->file_window+file_window_id;
			if(f->state!=FILE_CLOSE)
				return FILE_ALREADY_OPEN;
			file_id=file_window_id;
		}
	else
		if((file_id=(*(memory_body->free_file)))<0)
			return NO_FILE_TO_OPEN;

	if(memory_set_file_capability(file_id,file_window->file.right,
			&(file_window->file.capability))<0)
		return CAN_NOT_SET_FILE_CAPABILITY;

	f=memory_body->file_window+file_id;
	file_front=f->file_front;
	file_back=f->file_back;
	if(file_id==file_back)
		*(memory_body->free_file)=-1;
	else{
		if(*(memory_body->free_file)==file_id)
			*(memory_body->free_file)=file_back;
		(memory_body->file_window+file_front)
			->file_back=file_back;
		(memory_body->file_window+file_back)
			->file_front=file_front;
	}
	COPY_FILE(file_window->file,f->file);

	f->block_ring=-1;

	if(p->file_ring<0){
		f->file_front=file_id;
		f->file_back=file_id;
		p->file_ring=file_id;
	}else{
		int front,back;
		struct file_window *f_f,*f_b;	
		front=p->file_ring;
		f_f=(memory_body->file_window+front);
		back=f_f->file_back;
		f_b=(memory_body->file_window+back);		
		f->file_front=front;f->file_back=back;
		f_f->file_back=file_id;f_b->file_front=file_id;
	};
	f->lock_number=0;
	f->state=FILE_OPEN;

	mount_page_table(file_id,f->file.window_length);

	p->file_number++;
	return file_id;
}

int close_file_window(int file_window_id,
	int give_up_flag,int wait_flag,
	struct capability *file_capability,int sleep_semaphore)
{
	struct physical_block *b;
	struct memory_process *p;
	struct file_window *f,*f_f,*f_b;
	int i,file_front,file_back;

	if((i=flush_file_window(give_up_flag,TRUE,wait_flag,
		file_window_id,sleep_semaphore,file_capability))<0)
			return i;
	f=memory_body->file_window+file_window_id;
	p=memory_body->memory_process+f->file.memory_process;	
	if(f->lock_number!=0)
		return FILE_IS_LOCKED;
	for(;f->block_ring>=0;){
		b=memory_body->physical_block;
		b=b+f->block_ring;
		if((b->state!=NOT_MODIFIED_BLOCK)||(b->lock_number>0))
			return EXIST_BLOCK;
		else
			free_one_block(f->block_ring);
	}
				
	file_front=f->file_front;
	file_back=f->file_back;
	if(file_front==file_window_id)
		p->file_ring=-1;
	else{
		f_f=(memory_body->file_window+file_front);
		f_b=(memory_body->file_window+file_back);
		f_f->file_back=file_back;
		f_b->file_front=file_front;
		if(p->file_ring==file_window_id)
			p->file_ring=file_back;
	}
	file_back=(*(memory_body->free_file));
	if(file_back<0){
			f->file_front=file_window_id;
			f->file_back=file_window_id;
			*(memory_body->free_file)=file_window_id;
		}
	else{
		f_b=(memory_body->file_window+file_back);
		file_front=f_b->file_front;
		f_f=(memory_body->file_window+file_front);

		f_f->file_back=file_window_id;
		f_b->file_front=file_window_id;
		f->file_front=file_front;
		f->file_back=file_back;
	}

	unmount_page_table((f->file.memory_process),file_window_id);

	f->state=FILE_CLOSE;
	memory_set_file_capability(file_window_id,NO_ACCESS_RIGHT,
		&(f->file.capability));
	p->file_number--;
	
	return 0;
}

⌨️ 快捷键说明

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