]> mj.ucw.cz Git - libucw.git/commitdiff
generalized BCONFIG_CAN_OVERWRITE to three different write policies
authorRobert Spalek <robert@ucw.cz>
Fri, 25 Jun 2004 12:47:17 +0000 (12:47 +0000)
committerRobert Spalek <robert@ucw.cz>
Fri, 25 Jun 2004 12:47:17 +0000 (12:47 +0000)
lib/fastbuf.h
lib/fb-buffer.c
lib/fb-file.c
lib/fb-limfd.c
lib/fb-mem.c
lib/fb-mmap.c

index 0104a61f1daa9a2519b0d5f2f9789ee2e0d53f9e..9cc646d3fac324f16466ee8e80b8dada9d629f8e 100644 (file)
@@ -2,6 +2,7 @@
  *     Sherlock Library -- Fast Buffered I/O
  *
  *     (c) 1997--2004 Martin Mares <mj@ucw.cz>
+ *     (c) 2004 Robert Spalek <robert@ucw.cz>
  *
  *     This software may be freely distributed and used according to the terms
  *     of the GNU Lesser General Public License.
@@ -101,6 +102,14 @@ int bconfig(struct fastbuf *f, uns type, int data);
 
 #define BCONFIG_IS_TEMP_FILE 0
 #define BCONFIG_CAN_OVERWRITE 1
+  /* Specified whether the caller is allowed to perform the following optimized
+   * 0-copy write operation:
+   *   - get the buffer by bdirect_read_prepare()
+   *   - modify the buffer, e.g. by putting \0's inside
+   *   - call bflush() to let the fastbuf know
+   * 0: read-only memory
+   * 1: you can write into read-write memory, if you restore the original value
+   * 2: you can rewrite the original content */
 
 /* Universal functions working on all fastbuf's */
 
index 03c8e32108ca7bc0abff0999ce7875cd2be7d58d..2e2d44541ff9cd87333baa85dd224e66fe3bcf72 100644 (file)
@@ -36,6 +36,18 @@ fbbuf_spout(struct fastbuf *f UNUSED)
   die("fbbuf: buffer overflow on write");
 }
 
+static int
+fbbuf_config(struct fastbuf *f UNUSED, uns item, int value UNUSED)
+{
+  switch (item)
+    {
+    case BCONFIG_CAN_OVERWRITE:
+      return 1;
+    default:
+      return -1;
+    }
+}
+
 void
 fbbuf_init_write(struct fastbuf *f, byte *buf, uns size)
 {
@@ -47,5 +59,5 @@ fbbuf_init_write(struct fastbuf *f, byte *buf, uns size)
   f->spout = fbbuf_spout;
   f->seek = NULL;
   f->close = NULL;
-  f->config = NULL;
+  f->config = fbbuf_config;
 }
index abb29ddf3f9bdd144c2f42417a94b2fe9eff1109..3b416de3fb965c5a059f5b06a52ff8d15fd5bcb9 100644 (file)
@@ -90,7 +90,7 @@ bfd_config(struct fastbuf *f, uns item, int value)
       FB_FILE(f)->is_temp_file = value;
       return 0;
     case BCONFIG_CAN_OVERWRITE:
-      return 1;
+      return 2;
     default:
       return -1;
     }
index c1b6cb2c9bf66b6b96372cadead1b5b210d75584..ac95d908915b42fb3ea2f0c4145886c8e4c77f16 100644 (file)
@@ -39,6 +39,18 @@ bfl_close(struct fastbuf *f)
   xfree(f);
 }
 
+static int
+bfl_config(struct fastbuf *f UNUSED, uns item, int value UNUSED)
+{
+  switch (item)
+    {
+    case BCONFIG_CAN_OVERWRITE:
+      return 2;
+    default:
+      return -1;
+    }
+}
+
 struct fastbuf *
 bopen_limited_fd(int fd, uns buflen, uns limit)
 {
@@ -54,6 +66,7 @@ bopen_limited_fd(int fd, uns buflen, uns limit)
   F->limit = limit;
   f->refill = bfl_refill;
   f->close = bfl_close;
+  f->config = bfl_config;
   return f;
 }
 
index daa807338301000882aa338cc5dc8ef1864619da..efe749c51ede07d18c1b1db6d4b2290ccd243e95 100644 (file)
@@ -149,6 +149,18 @@ fbmem_close(struct fastbuf *f)
   xfree(f);
 }
 
+static int
+fbmem_config(struct fastbuf *f UNUSED, uns item, int value UNUSED)
+{
+  switch (item)
+    {
+    case BCONFIG_CAN_OVERWRITE:
+      return 1;
+    default:
+      return -1;
+    }
+}
+
 struct fastbuf *
 fbmem_create(unsigned blocksize)
 {
@@ -162,6 +174,7 @@ fbmem_create(unsigned blocksize)
   f->name = "<fbmem-write>";
   f->spout = fbmem_spout;
   f->close = fbmem_close;
+  f->config = fbmem_config;
   return f;
 }
 
@@ -179,6 +192,7 @@ fbmem_clone_read(struct fastbuf *b)
   f->refill = fbmem_refill;
   f->seek = fbmem_seek;
   f->close = fbmem_close;
+  f->config = fbmem_config;
   return f;
 }
 
index f4f901840ced7a5cf205518149c4c10797215eef..bbd3a11eacc6e1017bed271b867f933160feefa9 100644 (file)
@@ -161,7 +161,7 @@ bfmm_config(struct fastbuf *f, uns item, int value)
       FB_MMAP(f)->is_temp_file = value;
       return 0;
     case BCONFIG_CAN_OVERWRITE:
-      return 0;
+      return 0;                                /* cannot use 1, because the pages would become dirty */
     default:
       return -1;
     }