generalized log buffer adjustments into functions. simplified next_log_record
usage.
This commit is contained in:
parent
6ca91f1271
commit
a1ea7cbe3e
1 changed files with 32 additions and 26 deletions
|
@ -513,6 +513,20 @@ adjust_log_config(struct file_header *hdr,
|
||||||
COFFEE_LOG_SIZE / *log_record_size : hdr->log_records;
|
COFFEE_LOG_SIZE / *log_record_size : hdr->log_records;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static uint16_t
|
||||||
|
modify_log_buffer(uint16_t log_record_size,
|
||||||
|
coffee_offset_t *offset, uint16_t *size)
|
||||||
|
{
|
||||||
|
uint16_t region;
|
||||||
|
|
||||||
|
region = *offset / log_record_size;
|
||||||
|
*offset %= log_record_size;
|
||||||
|
if(*size > log_record_size - *offset) {
|
||||||
|
*size = log_record_size - *offset;
|
||||||
|
}
|
||||||
|
return region;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
static int
|
static int
|
||||||
get_record_index(coffee_page_t log_page, uint16_t record_count,
|
get_record_index(coffee_page_t log_page, uint16_t record_count,
|
||||||
uint16_t search_records, uint16_t region)
|
uint16_t search_records, uint16_t region)
|
||||||
|
@ -561,18 +575,14 @@ read_log_page(struct file_header *hdr, int16_t last_record, struct log_param *lp
|
||||||
uint16_t search_records;
|
uint16_t search_records;
|
||||||
|
|
||||||
adjust_log_config(hdr, &log_record_size, &log_records);
|
adjust_log_config(hdr, &log_record_size, &log_records);
|
||||||
|
region = modify_log_buffer(log_record_size, &lp->offset, &lp->size);
|
||||||
region = lp->offset / log_record_size;
|
|
||||||
lp->offset %= log_record_size;
|
|
||||||
if(lp->size > log_record_size - lp->offset) {
|
|
||||||
lp->size = log_record_size - lp->offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
search_records = last_record < 0 ? log_records : last_record + 1;
|
search_records = last_record < 0 ? log_records : last_record + 1;
|
||||||
record_count = search_records > COFFEE_LOG_TABLE_LIMIT ?
|
record_count = search_records > COFFEE_LOG_TABLE_LIMIT ?
|
||||||
COFFEE_LOG_TABLE_LIMIT : search_records;
|
COFFEE_LOG_TABLE_LIMIT : search_records;
|
||||||
|
|
||||||
match_index = get_record_index(hdr->log_page, record_count, search_records, region);
|
match_index = get_record_index(hdr->log_page, record_count,
|
||||||
|
search_records, region);
|
||||||
if(match_index < 0) {
|
if(match_index < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -712,7 +722,7 @@ static int
|
||||||
write_log_page(struct file_desc *fdp, struct log_param *lp)
|
write_log_page(struct file_desc *fdp, struct log_param *lp)
|
||||||
{
|
{
|
||||||
struct file_header hdr;
|
struct file_header hdr;
|
||||||
coffee_page_t page;
|
uint16_t region;
|
||||||
coffee_page_t log_page;
|
coffee_page_t log_page;
|
||||||
int16_t log_record;
|
int16_t log_record;
|
||||||
uint16_t log_record_size;
|
uint16_t log_record_size;
|
||||||
|
@ -723,16 +733,11 @@ write_log_page(struct file_desc *fdp, struct log_param *lp)
|
||||||
uint16_t record_count;
|
uint16_t record_count;
|
||||||
|
|
||||||
read_header(&hdr, fdp->file_page);
|
read_header(&hdr, fdp->file_page);
|
||||||
adjust_log_config(&hdr, &log_record_size, &log_records);
|
|
||||||
|
|
||||||
page = lp->offset / log_record_size;
|
adjust_log_config(&hdr, &log_record_size, &log_records);
|
||||||
lp->offset %= log_record_size;
|
region = modify_log_buffer(log_record_size, &lp->offset, &lp->size);
|
||||||
if(lp->size > log_record_size - lp->offset) {
|
|
||||||
lp->size = log_record_size - lp->offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
log_page = 0;
|
log_page = 0;
|
||||||
|
|
||||||
if(COFFEE_PAGE_MODIFIED(hdr)) {
|
if(COFFEE_PAGE_MODIFIED(hdr)) {
|
||||||
/* A log structure has already been created. */
|
/* A log structure has already been created. */
|
||||||
record_count = log_records > COFFEE_LOG_TABLE_LIMIT ?
|
record_count = log_records > COFFEE_LOG_TABLE_LIMIT ?
|
||||||
|
@ -783,27 +788,27 @@ write_log_page(struct file_desc *fdp, struct log_param *lp)
|
||||||
{
|
{
|
||||||
unsigned char copy_buf[log_record_size];
|
unsigned char copy_buf[log_record_size];
|
||||||
|
|
||||||
lp_out.offset = page * log_record_size;
|
lp_out.offset = region * log_record_size;
|
||||||
lp_out.buf = copy_buf;
|
lp_out.buf = copy_buf;
|
||||||
lp_out.size = log_record_size;
|
lp_out.size = log_record_size;
|
||||||
|
|
||||||
if((lp->offset > 0 || lp->size != log_record_size) &&
|
if((lp->offset > 0 || lp->size != log_record_size) &&
|
||||||
read_log_page(&hdr, fdp->next_log_record > 0 ? fdp->next_log_record - 1 : -1, &lp_out) < 0) {
|
read_log_page(&hdr, fdp->next_log_record - 1, &lp_out) < 0) {
|
||||||
COFFEE_READ(copy_buf, sizeof(copy_buf),
|
COFFEE_READ(copy_buf, sizeof(copy_buf),
|
||||||
ABS_OFFSET(fdp->file_page, page * log_record_size));
|
ABS_OFFSET(fdp->file_page, region * log_record_size));
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy((char *) ©_buf + lp->offset, lp->buf, lp->size);
|
memcpy((char *) ©_buf + lp->offset, lp->buf, lp->size);
|
||||||
|
|
||||||
base = (unsigned long)log_page * COFFEE_PAGE_SIZE;
|
base = (unsigned long)log_page * COFFEE_PAGE_SIZE;
|
||||||
base += sizeof(hdr);
|
base += sizeof(hdr);
|
||||||
base += log_records * sizeof(page);
|
base += log_records * sizeof(region);
|
||||||
base += (unsigned long)log_record * log_record_size;
|
base += (unsigned long)log_record * log_record_size;
|
||||||
|
|
||||||
COFFEE_WRITE(copy_buf, sizeof(copy_buf), base);
|
COFFEE_WRITE(copy_buf, sizeof(copy_buf), base);
|
||||||
++page;
|
++region;
|
||||||
COFFEE_WRITE(&page, sizeof(page),
|
COFFEE_WRITE(®ion, sizeof(region),
|
||||||
ABS_OFFSET(log_page, log_record * sizeof(page)));
|
ABS_OFFSET(log_page, log_record * sizeof(region)));
|
||||||
fdp->next_log_record = log_record + 1;
|
fdp->next_log_record = log_record + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -970,8 +975,7 @@ cfs_read(int fd, void *buf, unsigned size)
|
||||||
lp.offset = base + offset;
|
lp.offset = base + offset;
|
||||||
lp.buf = (char *)buf + offset;
|
lp.buf = (char *)buf + offset;
|
||||||
lp.size = remains;
|
lp.size = remains;
|
||||||
r = read_log_page(&hdr,
|
r = read_log_page(&hdr, fdp->next_log_record - 1, &lp);
|
||||||
fdp->next_log_record > 0 ? fdp->next_log_record - 1 : -1, &lp);
|
|
||||||
}
|
}
|
||||||
/* Read from the original file if we cannot find the data in the log. */
|
/* Read from the original file if we cannot find the data in the log. */
|
||||||
if(r < 0) {
|
if(r < 0) {
|
||||||
|
@ -1099,12 +1103,14 @@ cfs_coffee_reserve(const char *name, uint32_t size)
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
int
|
int
|
||||||
cfs_coffee_configure_log(const char *file, unsigned log_size, unsigned log_record_size)
|
cfs_coffee_configure_log(const char *file, unsigned log_size,
|
||||||
|
unsigned log_record_size)
|
||||||
{
|
{
|
||||||
coffee_page_t page;
|
coffee_page_t page;
|
||||||
struct file_header hdr;
|
struct file_header hdr;
|
||||||
|
|
||||||
if(log_record_size == 0 || log_record_size > COFFEE_PAGE_SIZE || log_size < log_record_size) {
|
if(log_record_size == 0 || log_record_size > COFFEE_PAGE_SIZE ||
|
||||||
|
log_size < log_record_size) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue