From 5448b5c0ece609bbe8ef08153dfb52567ce913c3 Mon Sep 17 00:00:00 2001 From: Rodrigo Arias Date: Mon, 22 Jul 2024 17:25:32 +0200 Subject: [PATCH] Check duplicated mark channel types are the same Ensure that two threads cannot define the same mark type with different channel types. --- src/emu/ovni/mark.c | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/emu/ovni/mark.c b/src/emu/ovni/mark.c index a29561e..3eb123b 100644 --- a/src/emu/ovni/mark.c +++ b/src/emu/ovni/mark.c @@ -142,7 +142,7 @@ find_mark_type(struct ovni_mark_emu *m, long type) } static struct mark_type * -create_mark_type(struct ovni_mark_emu *m, long type, const char *chan_type, const char *title) +create_mark_type(struct ovni_mark_emu *m, long type, enum chan_type ctype, const char *title) { struct mark_type *t = find_mark_type(m, type); @@ -158,6 +158,7 @@ create_mark_type(struct ovni_mark_emu *m, long type, const char *chan_type, cons } t->type = type; + t->ctype = ctype; t->prvtype = type + PRV_OVNI_MARK; t->index = m->ntypes; @@ -167,15 +168,6 @@ create_mark_type(struct ovni_mark_emu *m, long type, const char *chan_type, cons return NULL; } - if (strcmp(chan_type, "single") == 0) { - t->ctype = CHAN_SINGLE; - } else if (strcmp(chan_type, "stack") == 0) { - t->ctype = CHAN_STACK; - } else { - err("chan_type %s not understood", chan_type); - return NULL; - } - HASH_ADD_LONG(m->types, type, t); m->ntypes++; @@ -217,9 +209,19 @@ parse_mark(struct ovni_mark_emu *m, const char *typestr, JSON_Value *markval) return -1; } + enum chan_type ctype; + if (strcmp(chan_type, "single") == 0) { + ctype = CHAN_SINGLE; + } else if (strcmp(chan_type, "stack") == 0) { + ctype = CHAN_STACK; + } else { + err("chan_type %s not understood", chan_type); + return -1; + } + struct mark_type *t = find_mark_type(m, type); if (t == NULL) { - t = create_mark_type(m, type, chan_type, title); + t = create_mark_type(m, type, ctype, title); if (t == NULL) { err("cannot create mark type"); return -1; @@ -233,6 +235,14 @@ parse_mark(struct ovni_mark_emu *m, const char *typestr, JSON_Value *markval) err(" new: %s", title); return -1; } + + /* And also the same channel type */ + if (t->ctype != ctype) { + err("mark with type %ld already registered with another channel type", type); + err(" old: %s", t->ctype == CHAN_SINGLE ? "single" : "stack"); + err(" new: %s", ctype == CHAN_SINGLE ? "single" : "stack"); + return -1; + } } /* The labels are optional */