📄 flush.c
字号:
#include"memory.h"
int flush_process_memory(
int give_up_flag,int free_block_flag,int wait_flag,
int process_number,int sleep_semaphore,
struct capability *process_capability)
{
int i,old_bn,bn,first_block,return_value,number,max_number;
struct physical_block *b;
struct memory_process *p;
i=process_unmemory_map_deal(
process_number,0,process_capability);
if(i<0)
return i;
p=memory_body->memory_process+process_number;
i=process_unmemory_map_deal(
process_number,p->max_block_number,process_capability);
if(i<0)
return i;
for(i=0,number=0,max_number=0;;){
if((first_block=p->block_ring)<0)
return number;
for(bn=first_block;;){
b=bn+(memory_body->physical_block);
if(wait_flag){
if(((b->state)==READING_BLOCK)
||((b->state)==WRITING_BLOCK)){
wait_block(bn,sleep_semaphore);
break;
}
}
if(max_number<(p->block_number))
max_number=(p->block_number);
i++;
if(i>max_number)
return number;
if(b->state==MODIFIED_BLOCK){
return_value=write_one_block(bn,
sleep_semaphore,give_up_flag);
if(return_value<0)
return return_value;
if(b->state!=MODIFIED_BLOCK)
number++;
break;
}
old_bn=b->buf_back;
if(b->state==NOT_MODIFIED_BLOCK){
if(b->lock_number>0)
clear_block_number(b);
if(free_block_flag)
if(b->lock_number<=0)
free_one_block(bn);
}
if((bn=old_bn)==first_block)
return number;
}
}
}
int flush_file_window(
int give_up_flag,int free_block_flag,int wait_flag,
int file_window_number,int sleep_semaphore,
struct capability *file_capability)
{
int i,first_block,bn,number,return_value,max_number;
struct physical_block *b;
struct file_window *f;
struct memory_process *p;
i=file_unmemory_map_deal(file_window_number,file_capability);
if(i<0) return i;
f=memory_body->file_window+file_window_number;
p=memory_body->memory_process+f->file.memory_process;
for(i=0,number=0,max_number=0;;){
if((first_block=f->block_ring)<0)
return number;
for(bn=first_block;;){
b=(memory_body->physical_block)+bn;
if(wait_flag){
if(((b->state)==READING_BLOCK)
||((b->state)==WRITING_BLOCK)){
wait_block(bn,sleep_semaphore);
break;
}
}
if(max_number<(p->block_number))
max_number=(p->block_number);
i++;
if(i>max_number)
return number;
if(b->state==MODIFIED_BLOCK){
f->block_ring=b->file_back;
return_value=write_one_block(bn,
sleep_semaphore,give_up_flag);
if(return_value<0)
return return_value;
if(b->state!=MODIFIED_BLOCK)
number++;
break;
}
if(b->state==NOT_MODIFIED_BLOCK){
if(b->lock_number>0)
clear_block_number(b);
if(free_block_flag)
if(b->lock_number<=0)
free_one_block(bn);
}
if((bn=b->file_back)==first_block)
return number;
f->block_ring=bn;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -