[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