[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