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

📄 buffer.c

📁 阿基米德操作系统的源代码
💻 C
字号:

#include "general.h"
#include "sti_cli.h"

#include "hd_info_struct.h"
#include "dir_entry.h"
#include "msdos_dir_entry.h"
#include "d_inode.h"
#include "m_inode.h"
#include "buffer_head.h"
#include "fat_cache.h"
#include "file.h"
#include "hd_request_struct.h"
#include "super_block.h"

#include "common_head.h"
int sys_sync(void){	struct buffer_head * bh;	int    i;
	sync_inodes();
sys_sync_0:	for (i = 0, bh = start_buffer; i < nr_buffers; i++,bh++)
		if (((bh < sys_buffer) || (bh->b_count == 0)) && (bh->b_lock == 0) && (bh->b_dirt))
			if (ll_rw_block_0(bh) <= 0) {
				ll_rw_block_1();
				goto sys_sync_0;
			}
	ll_rw_block_1();	return 0;}

struct buffer_head * bread(int dev, int block, unsigned char floppy_importflag)
{
	struct buffer_head * bh;
	int i;

	for (bh = hash_table[block % NR_HASH] ; bh != NULL ; bh = bh->b_next)
		if (bh->b_dev == dev && bh->b_blocknr == block){
			while (bh->b_lock);
			if (!(bh->b_uptodate & 0x01))
			{
				if (floppy_importflag == 0x80)
					floppy_workstate = -1;
				return NULL;
			}
			bh->b_uptodate = bh->b_uptodate | floppy_importflag;
			if ((bh->b_count == 0) && (bh->b_dirt == 0)){
				cli();
				bh->b_prev_free->b_next_free = bh->b_next_free;
				bh->b_next_free->b_prev_free = bh->b_prev_free;
				if (free_list == bh)
					free_list = bh->b_next_free;
				if (free_list == bh)
					free_list = NULL;
				sti();
				bh->b_prev_free = bh->b_next_free = bh;
			}
			bh->b_count++;
			return bh;
		}
	while (free_list == NULL){

		for (i = 0; i < SYNC_BUFFERS; i++){
			if (((current_buffer < sys_buffer) || (current_buffer->b_count == 0)) && 
				(current_buffer->b_lock == 0) && (current_buffer->b_dirt))
				if (ll_rw_block_0(current_buffer) <= 0)
					break;
			current_buffer++;
			if (current_buffer == end_buffer)
				current_buffer = start_buffer;
		}
		ll_rw_block_1();
	}

	cli();
	bh = free_list;
	bh->b_prev_free->b_next_free = bh->b_next_free;
	bh->b_next_free->b_prev_free = bh->b_prev_free;
	free_list = bh->b_next_free;
	if (free_list == bh)
		free_list = NULL;
	sti();
	bh->b_prev_free = bh->b_next_free = bh;

	if (bh->b_next)
		bh->b_next->b_prev = bh->b_prev;
	if (bh->b_prev)
		bh->b_prev->b_next = bh->b_next;
	if (hash_table[bh->b_blocknr % NR_HASH] == bh)
		hash_table[bh->b_blocknr % NR_HASH] = bh->b_next;
	bh->b_prev = NULL;
	bh->b_next = NULL;

	bh->b_dev		= dev;
	bh->b_blocknr	= block;
	bh->b_uptodate	= floppy_importflag;
	bh->b_dirt		= 0;
	bh->b_count		= 1;
	
	bh->b_next = hash_table[bh->b_blocknr % NR_HASH];
	hash_table[bh->b_blocknr % NR_HASH] = bh;
	if (bh->b_next)
		bh->b_next->b_prev = bh;

	ll_rw_block_2(bh);
	while (bh->b_lock);
	if (bh->b_uptodate & 0x01)
		return bh;
	else {
		bh->b_count = 0;
		cli();
		if (free_list == NULL)
			free_list = bh;
		else {
			bh->b_next_free = free_list;	
			bh->b_prev_free = free_list->b_prev_free;
			free_list->b_prev_free->b_next_free = bh;
			free_list->b_prev_free = bh;
			free_list = bh;
		}
		sti();		
		return NULL;
	}
	return NULL;
}
void brelse(struct buffer_head * buf){	if (!buf || (buf->b_count == 0))
		return;
	buf->b_count--;
	if ((buf->b_count == 0) && (buf->b_dirt == 0)){
		cli();
		if (free_list == NULL)
			free_list = buf;
		else {
			buf->b_next_free = free_list;	
			buf->b_prev_free = free_list->b_prev_free;
			free_list->b_prev_free->b_next_free = buf;
			free_list->b_prev_free = buf;
		}
		sti();
	}
	return;
}
///////////////////////////////////////////////////////////////////////
int  ll_rw_block_0(struct buffer_head * bh)
{
	int temp_ret;

	if (bh->b_dev == 0)
		temp_ret = ll_rw_block_f0(bh);
	else
		temp_ret = ll_rw_block_h0(bh);

	return temp_ret;
}

void ll_rw_block_1(void)
{
	ll_rw_block_f1();
	ll_rw_block_h1();

	return;
}

int  ll_rw_block_2(struct buffer_head * bh)
{
	int temp_ret;

	if (bh->b_dev == 0)
		temp_ret = ll_rw_block_f2(bh);
	else
		temp_ret = ll_rw_block_h2(bh);

	return temp_ret;
}

///////////////////////////////////////////////////////////////////////


⌨️ 快捷键说明

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