diff options
| author | 2025-03-15 20:40:38 -0400 | |
|---|---|---|
| committer | 2025-03-15 20:40:38 -0400 | |
| commit | 846bd3d1b7bcec3653aa9d662f559235c4689e1b (patch) | |
| tree | 56906544460079681f46d23d48d76f1a8242ea75 /src/cache/backings | |
| parent | 46d5660a2582323e1c9c33a56694c322bc21b7bc (diff) | |
| download | camu-846bd3d1b7bcec3653aa9d662f559235c4689e1b.tar.gz camu-846bd3d1b7bcec3653aa9d662f559235c4689e1b.tar.bz2 camu-846bd3d1b7bcec3653aa9d662f559235c4689e1b.zip | |
Sink refactor wip
Dangling target won't stay around. I have a couple of ideas about how to massively simplify the handling of ended entries.
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/cache/backings')
| -rw-r--r-- | src/cache/backings/file.c | 25 | ||||
| -rw-r--r-- | src/cache/backings/file.h | 1 | ||||
| -rw-r--r-- | src/cache/backings/file_common.c | 5 | ||||
| -rw-r--r-- | src/cache/backings/file_mapped.c | 20 |
4 files changed, 28 insertions, 23 deletions
diff --git a/src/cache/backings/file.c b/src/cache/backings/file.c index bf62190..f421623 100644 --- a/src/cache/backings/file.c +++ b/src/cache/backings/file.c @@ -17,12 +17,14 @@ static void file_backing_write(struct cch_backing *backing, u8 *buf, off_t index file->u.pointer = nn_file_seek(&file->file, index, SEEK_SET); al_assert(file->u.pointer == index); } - if (file->size >= 0 && index + ((off_t)*size) >= file->size) { - *size = MAX(file->size - index, 0L); + off_t n = (off_t)*size; + if (file->size >= 0 && index + n >= file->size) { + n = MAX(file->size - index, (off_t)0); } - nn_file_write(&file->file, buf, *size); - file->u.pointer += *size; - cch_backing_fill_range(&file->backing, index, *size); + nn_file_write(&file->file, buf, n); + file->u.pointer += n; + cch_backing_fill_range(&file->backing, index, n); + *size = (size_t)n; nn_mutex_unlock(&file->mutex); } @@ -34,11 +36,13 @@ static void file_backing_read(struct cch_backing *backing, u8 *buf, off_t index, file->u.pointer = nn_file_seek(&file->file, index, SEEK_SET); al_assert(file->u.pointer == index); } - if (file->size >= 0 && index + ((off_t)*size) >= file->size) { - *size = MAX(file->size - index, 0L); + off_t n = (off_t)*size; + if (file->size >= 0 && index + n >= file->size) { + n = MAX(file->size - index, (off_t)0); } - nn_file_read(&file->file, buf, *size); - file->u.pointer += *size; + nn_file_read(&file->file, buf, n); + file->u.pointer += n; + *size = (size_t)n; nn_mutex_unlock(&file->mutex); } @@ -53,9 +57,8 @@ static void file_backing_resize(struct cch_backing *backing, size_t size) struct cch_backing_file *file = (struct cch_backing_file *)backing; nn_mutex_lock(&file->mutex); file->size = size; - if ((off_t)size > file->filesize) { + if (size > file->file.size) { nn_file_truncate(&file->file, size); - file->filesize = size; } nn_mutex_unlock(&file->mutex); } diff --git a/src/cache/backings/file.h b/src/cache/backings/file.h index 8a2bf7a..9ffd650 100644 --- a/src/cache/backings/file.h +++ b/src/cache/backings/file.h @@ -11,7 +11,6 @@ struct cch_backing_file { struct cch_backing backing; struct nn_file file; off_t size; - off_t filesize; union { void *map; // CACHE_BACKING_MAPPED off_t pointer; // CACHE_BACKING_READ diff --git a/src/cache/backings/file_common.c b/src/cache/backings/file_common.c index 0ee2574..e8bd2ca 100644 --- a/src/cache/backings/file_common.c +++ b/src/cache/backings/file_common.c @@ -11,13 +11,12 @@ static bool file_open_internal(struct cch_backing_file *file, str *path, size_t { s32 flags = size != 0 ? NNWT_FILE_CREATE : NNWT_FILE_READONLY; if (!nn_file_open(&file->file, path, flags)) return false; - file->filesize = nn_file_get_filesize(&file->file); if (!size) { - file->size = file->filesize; + file->size = file->file.size; cch_backing_fill_range(&file->backing, 0, file->size); } else { file->size = -1; - if (file->filesize < (off_t)size) { + if (file->file.size < size) { nn_file_truncate(&file->file, size); } } diff --git a/src/cache/backings/file_mapped.c b/src/cache/backings/file_mapped.c index 35ab267..e13d602 100644 --- a/src/cache/backings/file_mapped.c +++ b/src/cache/backings/file_mapped.c @@ -13,11 +13,13 @@ static void file_backing_write(struct cch_backing *backing, u8 *buf, off_t index { struct cch_backing_file *file = (struct cch_backing_file *)backing; nn_mutex_lock(&file->mutex); - if (file->size >= 0 && index + (off_t)*size >= file->size) { - *size = MAX(file->size - index, 0L); + off_t n = (off_t)*size; + if (file->size >= 0 && index + n >= file->size) { + n = MAX(file->size - index, (off_t)0); } - al_memcpy(file->u.map + index, buf, *size); - cch_backing_fill_range(&file->backing, index, *size); + al_memcpy(file->u.map + index, buf, n); + cch_backing_fill_range(&file->backing, index, n); + *size = (size_t)n; nn_mutex_unlock(&file->mutex); } @@ -25,9 +27,11 @@ static u8 *file_backing_get_ptr(struct cch_backing *backing, off_t index, size_t { struct cch_backing_file *file = (struct cch_backing_file *)backing; nn_mutex_lock(&file->mutex); - if (file->size >= 0 && index + (off_t)*size >= file->size) { - *size = MAX(file->size - index, 0L); + off_t n = (off_t)*size; + if (file->size >= 0 && index + n >= file->size) { + n = MAX(file->size - index, (off_t)0); } + *size = (size_t)n; return (u8 *)(file->u.map + index); } @@ -42,11 +46,11 @@ static void file_backing_resize(struct cch_backing *backing, size_t size) struct cch_backing_file *file = (struct cch_backing_file *)backing; nn_mutex_lock(&file->mutex); file->size = size; - if ((off_t)size > file->filesize) { + if (size > file->file.size) { nn_file_munmap(&file->file, file->u.map); nn_file_truncate(&file->file, size); file->u.map = nn_file_mmap(&file->file); - file->filesize = size; + file->file.size = size; } nn_mutex_unlock(&file->mutex); } |