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

📄 write_block.c

📁 虚地址空间基于文件OS内核源代码和文件
💻 C
字号:
#include "memory.h"

#define UNMAP_FAIL	-1

int write_one_block(int physical_block_number,
	int sleep_semaphore,int give_up_flag)
{
	int bn,front,back,return_value;
	struct physical_block *b,*b_f,*b_b;
	struct file_window *f;
	struct memory_process *p;
	
	bn=physical_block_number;
	b=memory_body->physical_block+bn;

	if((b->state!=MODIFIED_BLOCK)&&(b->state!=NOT_MODIFIED_BLOCK))
		return 0;

	f=memory_body->file_window+b->file_window;
	p=memory_body->memory_process+f->file.memory_process;

	front=b->buf_front;back=b->buf_back;
	if(front==bn)
		p->block_ring=-1;
	else{
		if(p->block_ring==bn)
			p->block_ring=front;
		b_f=front+memory_body->physical_block;
		b_b=back+memory_body->physical_block;
		b_f->buf_back=back;b_b->buf_front=front;
	}
	clear_block_number(b);
	return_value=0;
	if((b->lock_number<=0)&&(b->state==MODIFIED_BLOCK)){
		b->lock_number=0;
		if(p->write_block_ring<0){
				p->write_block_ring=bn;
				b->buf_front=bn;b->buf_back=bn;
			}
		else{
			front=p->write_block_ring;
			b_f=front+memory_body->physical_block;
			back=b_f->buf_back;
			b_b=back+memory_body->physical_block;

			b->buf_front=front;b->buf_back=back;
			b_f->buf_back=bn;b_b->buf_front=bn;
		}
		b->state=WRITING_BLOCK;
		b->lock_number++;
		p->write_block_number++;

		if(give_up_flag)
			return_value=0;
		else{
			return_value=read_write_file_system(
				WRITE_FILE,bn,b,f,
				(b->logic_block_number)*PAGE_SIZE,
				sleep_semaphore);
			wake_block(bn);
		}
		p->write_block_number--;
		b->lock_number--;
	
		front=b->buf_front;back=b->buf_back;
		if(front==bn)
			p->write_block_ring=-1;
		else{
			if(p->write_block_ring==bn)
				p->write_block_ring=front;
			b_f=front+memory_body->physical_block;
			b_b=back+memory_body->physical_block;
			b_f->buf_back=back;b_b->buf_front=front;
		}
		if((return_value>=0)&&(b->lock_number==0))
			b->state=NOT_MODIFIED_BLOCK;
		else
			b->state=MODIFIED_BLOCK;
	}
	
	if(p->block_ring<0){
		b->buf_front=bn;b->buf_back=bn;
		front=bn;back=bn;
	}else{
		front=p->block_ring;
		b_f=front+memory_body->physical_block;
		back=b_f->buf_back;
		b_b=back+memory_body->physical_block;
	
		b->buf_front=front;b->buf_back=back;
		b_f->buf_back=bn;b_b->buf_front=bn;
	}
	p->block_ring=front;
	return return_value;
}

⌨️ 快捷键说明

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