[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH 2/6] kernel2: Non-seekable Ressourcen nur einmal öffnen



* kernel2: Wenn man eine non-seekable Ressource ein zweites Mal öffnet,
  bekommt man nur einen Alias für den existierenden Stream. Dadurch
  bleibt der Dateizeiger konsistent, auch wenn mehrere Programme vom
  selben Stream lesen.

Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
 src/kernel2/src/lostio/client.c             | 21 +++++++++++++++++++++
 src/kernel2/src/lostio/include/lostio_int.h |  6 ++++++
 2 files changed, 27 insertions(+)

diff --git a/src/kernel2/src/lostio/client.c b/src/kernel2/src/lostio/client.c
index 3b4c2c6..46f2456 100644
--- a/src/kernel2/src/lostio/client.c
+++ b/src/kernel2/src/lostio/client.c
@@ -241,6 +241,16 @@ struct lio_stream* lio_open(struct lio_resource* res, int flags)
         return NULL;
     }
 
+    // Non-seekable Streams dürfen nur einmal geöffnet sein.  Vorläufig den
+    // schon existierenden Stream zurückgeben, falls die Flags passen.
+    // TODO Immer Fehler zurückgeben sobald der Userspace damit klarkommt
+    if (res->excl_stream) {
+        if (res->excl_stream->flags != flags) {
+            return NULL;
+        }
+        return res->excl_stream;
+    }
+
     // Stream anlegen und initialisieren
     s = calloc(1, sizeof(*s));
     s->res = s->res_read = s->res_write = res;
@@ -261,6 +271,11 @@ struct lio_stream* lio_open(struct lio_resource* res, int flags)
         }
     }
 
+    // Non-seekable Streams dürfen nur einmal geöffnet sein
+    if (!res->seekable) {
+        res->excl_stream = s;
+    }
+
     return s;
 
 fail:
@@ -569,10 +584,16 @@ int lio_truncate(struct lio_stream* s, uint64_t size)
  */
 int lio_close(struct lio_stream* s)
 {
+    // Sicherstellen, dass lio_open() den Stream nicht rausrückt, während wir
+    // ihn gerade schließen
+    s->flags = 0;
+
     if (s->res->tree->service->lio_ops.close) {
         s->res->tree->service->lio_ops.close(s);
     }
 
+    s->res->excl_stream = NULL;
+
     free(s);
     return 0;
 }
diff --git a/src/kernel2/src/lostio/include/lostio_int.h b/src/kernel2/src/lostio/include/lostio_int.h
index a8d112a..4feb05c 100644
--- a/src/kernel2/src/lostio/include/lostio_int.h
+++ b/src/kernel2/src/lostio/include/lostio_int.h
@@ -186,6 +186,12 @@ struct lio_resource {
     /** Sortierung nach usp_id im Baum */
     struct tree_item            usp_item;
 
+    /**
+     * Falls die Ressource nur einmal geöffnet werden kann, der offene Stream,
+     * der sie zugreift, oder NULL, wenn sie nicht geöffnet ist.
+     */
+    struct lio_stream*          excl_stream;
+
     /** Private Daten des Services */
     void*                       opaque;
 };
-- 
2.1.2