[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[tyndur-devel] [PATCH] CDI-Cache
From: Max Reitz <max@xxxxxxxxxx>
* Den Cache kann man besser ausnutzen: Wenn ein FS-Treiber versucht,
einen Block zwei Kilobyte vor dem Cache einzulesen, dann muss man
nur zwei einlesen, nicht READBUF_SZ (128), wenn man memmove
geschickt einsetzt.
Signed-off-by: Max Reitz <max@xxxxxxxxxx>
---
src/modules/cdi/lib/cache.c | 24 +++++++++++++++++++++++-
1 files changed, 23 insertions(+), 1 deletions(-)
diff --git a/src/modules/cdi/lib/cache.c b/src/modules/cdi/lib/cache.c
index b8c41ba..17b88c9 100644
--- a/src/modules/cdi/lib/cache.c
+++ b/src/modules/cdi/lib/cache.c
@@ -354,12 +354,34 @@ static int load_block(struct cache* c, struct block* b)
if ((rbbnum == INVBLKNUM) || (rbbnum > block) || (block >= rbbnum +
c->read_buffer_cnt))
{
+ size_t sync_size = READBUF_SZ;
+ size_t recyclable = 0;
+
+ // Wenn der Block nur kurz vor dem Cache liegt, kann man auch einen
+ // Teil des Caches wiederverwenden
+ if ((block < rbbnum) && (block > rbbnum - READBUF_SZ)) {
+ sync_size = rbbnum - block;
+ recyclable = READBUF_SZ - sync_size;
+
+ memmove((uint8_t*) c->read_buffer + sync_size * block_size,
+ c->read_buffer, recyclable * block_size);
+ }
+
c->read_buffer_block = rbbnum = block;
c->read_buffer_cnt = c->read_block(
- (struct cdi_cache*) c, block, READBUF_SZ,
+ (struct cdi_cache*) c, block, sync_size,
c->read_buffer, c->prv_data);
+ if (recyclable && (c->read_buffer_cnt < sync_size)) {
+ // Cache jetzt komplett einlesen, weil Lücken doof sind.
+ c->read_buffer_cnt = c->read_block(
+ (struct cdi_cache*) c, block, READBUF_SZ,
+ c->read_buffer, c->prv_data);
+ } else if (recyclable) {
+ c->read_buffer_cnt += recyclable;
+ }
+
if (c->read_buffer_cnt == 0) {
puts("cdi_cache Panic: Einlesen der Daten fehlgeschlagen");
return 0;
--
1.6.4.2