doubled the speed of uncached file openings.
This commit is contained in:
parent
3f71499c96
commit
bc7c90bb9f
1 changed files with 13 additions and 7 deletions
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue