📄 write_block.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 + -