doubled the speed of uncached file openings.

This commit is contained in:
nvt-se 2009-02-22 15:19:31 +00:00
parent 3f71499c96
commit bc7c90bb9f

View file

@ -145,9 +145,11 @@ struct log_param {
static struct protected_mem_t { static struct protected_mem_t {
struct file coffee_files[COFFEE_MAX_OPEN_FILES]; struct file coffee_files[COFFEE_MAX_OPEN_FILES];
struct file_desc coffee_fd_set[COFFEE_FD_SET_SIZE]; struct file_desc coffee_fd_set[COFFEE_FD_SET_SIZE];
coffee_page_t next_free;
} protected_mem; } protected_mem;
static struct file *coffee_files = protected_mem.coffee_files; static struct file *coffee_files = protected_mem.coffee_files;
static struct file_desc *coffee_fd_set = protected_mem.coffee_fd_set; static struct file_desc *coffee_fd_set = protected_mem.coffee_fd_set;
static coffee_page_t *next_free = &protected_mem.next_free;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static void static void
@ -258,6 +260,7 @@ cfs_garbage_collect(void)
{ {
uint16_t sector; uint16_t sector;
struct sector_stats stats; struct sector_stats stats;
coffee_page_t first_page;
watchdog_stop(); watchdog_stop();
@ -273,6 +276,10 @@ cfs_garbage_collect(void)
if(stats.active == 0 && stats.obsolete > 0) { if(stats.active == 0 && stats.obsolete > 0) {
COFFEE_ERASE(sector); COFFEE_ERASE(sector);
PRINTF("Coffee: Erased sector %d!\n", sector); PRINTF("Coffee: Erased sector %d!\n", sector);
first_page = sector * COFFEE_PAGES_PER_SECTOR;
if(first_page < *next_free) {
*next_free = first_page;
}
} }
} }
@ -282,8 +289,6 @@ cfs_garbage_collect(void)
static coffee_page_t static coffee_page_t
next_file(coffee_page_t page, struct file_header *hdr) next_file(coffee_page_t page, struct file_header *hdr)
{ {
coffee_page_t next_page;
if(HDR_FREE(*hdr)) { if(HDR_FREE(*hdr)) {
return (page + COFFEE_PAGES_PER_SECTOR) & ~(COFFEE_PAGES_PER_SECTOR - 1); return (page + COFFEE_PAGES_PER_SECTOR) & ~(COFFEE_PAGES_PER_SECTOR - 1);
} else if(HDR_ISOLATED(*hdr)) { } else if(HDR_ISOLATED(*hdr)) {
@ -451,11 +456,11 @@ find_contiguous_pages(coffee_page_t amount)
coffee_page_t page, start; coffee_page_t page, start;
struct file_header hdr; struct file_header hdr;
start = -1; start = INVALID_PAGE;
for(page = 0; page < COFFEE_PAGE_COUNT;) { for(page = *next_free; page < COFFEE_PAGE_COUNT;) {
read_header(&hdr, page); read_header(&hdr, page);
if(HDR_FREE(hdr)) { if(HDR_FREE(hdr)) {
if(start == -1) { if(start == INVALID_PAGE) {
start = page; start = page;
} }
@ -463,14 +468,15 @@ find_contiguous_pages(coffee_page_t amount)
page = next_file(page, &hdr); page = next_file(page, &hdr);
if(start + amount <= page) { if(start + amount <= page) {
*next_free = start + amount;
return start; return start;
} }
} else { } else {
start = -1; start = INVALID_PAGE;
page = next_file(page, &hdr); page = next_file(page, &hdr);
} }
} }
return -1; return INVALID_PAGE;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static int static int