fixed bug with eof hint

This commit is contained in:
nvt-se 2008-08-28 14:31:10 +00:00
parent f122654317
commit 86bce2636d

View file

@ -306,7 +306,8 @@ find_offset_in_file(int first_page)
unsigned char buf[COFFEE_PAGE_SIZE]; unsigned char buf[COFFEE_PAGE_SIZE];
int page; int page;
int i; int i;
int search_limit, range_start, range_end, part_size; int search_limit;
uint32_t range_start, range_end, part_size;
READ_HEADER(&hdr, first_page); READ_HEADER(&hdr, first_page);
for(search_limit = i = 0; i < sizeof(hdr.eof_hint) * CHAR_BIT; i++) { for(search_limit = i = 0; i < sizeof(hdr.eof_hint) * CHAR_BIT; i++) {
@ -315,6 +316,9 @@ find_offset_in_file(int first_page)
} }
} }
part_size = hdr.max_pages / sizeof(hdr.eof_hint) / CHAR_BIT; part_size = hdr.max_pages / sizeof(hdr.eof_hint) / CHAR_BIT;
if(part_size == 0) {
part_size = 1;
}
range_start = part_size * search_limit; range_start = part_size * search_limit;
range_end = range_start + part_size; range_end = range_start + part_size;
@ -612,10 +616,11 @@ flush_log(uint16_t file_page)
return -1; return -1;
} }
/* Copy the log configuration. */ /* Copy the log configuration and the EOF hint. */
READ_HEADER(&hdr2, new_file_page); READ_HEADER(&hdr2, new_file_page);
hdr2.log_entry_size = hdr.log_entry_size; hdr2.log_entry_size = hdr.log_entry_size;
hdr2.log_entries = hdr.log_entries; hdr2.log_entries = hdr.log_entries;
hdr2.eof_hint = hdr.eof_hint;
WRITE_HEADER(&hdr2, new_file_page); WRITE_HEADER(&hdr2, new_file_page);
/* Point the file descriptors to the new file page. */ /* Point the file descriptors to the new file page. */
@ -799,7 +804,9 @@ cfs_close(int fd)
READ_HEADER(&hdr, coffee_fd_set[fd].file_page); READ_HEADER(&hdr, coffee_fd_set[fd].file_page);
current_page = (coffee_fd_set[fd].end + COFFEE_PAGE_SIZE - 1) / COFFEE_PAGE_SIZE; current_page = (coffee_fd_set[fd].end + COFFEE_PAGE_SIZE - 1) / COFFEE_PAGE_SIZE;
part_size = hdr.max_pages / (sizeof(hdr.eof_hint) * CHAR_BIT); part_size = hdr.max_pages / (sizeof(hdr.eof_hint) * CHAR_BIT);
if(part_size == 0) {
part_size = 1;
}
for(i = eof_hint = 0; i < sizeof(eof_hint) * CHAR_BIT; i++) { for(i = eof_hint = 0; i < sizeof(eof_hint) * CHAR_BIT; i++) {
eof_hint |= (current_page > (i + 1) * part_size) << i; eof_hint |= (current_page > (i + 1) * part_size) << i;
} }
@ -821,9 +828,9 @@ cfs_seek(int fd, unsigned offset)
if(!FD_VALID(fd)) { if(!FD_VALID(fd)) {
return -1; return -1;
} }
READ_HEADER(&hdr, coffee_fd_set[fd].file_page); READ_HEADER(&hdr, coffee_fd_set[fd].file_page);
if(sizeof(hdr) + offset >= hdr.max_pages * COFFEE_PAGE_SIZE) { if(sizeof(hdr) + offset >= hdr.max_pages * COFFEE_PAGE_SIZE ||
sizeof(hdr) + offset < offset) {
/* XXX: Try to extend the file here? */ /* XXX: Try to extend the file here? */
return -1; return -1;
} }
@ -1002,7 +1009,7 @@ cfs_closedir(struct cfs_dir *dir)
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
int int
cfs_coffee_reserve(const char *name, uint32_t size) cfs_coffee_reserve(const char *name, uint16_t size)
{ {
struct file_header hdr; struct file_header hdr;
unsigned need_pages; unsigned need_pages;