diff --git a/include/villas/list.h b/include/villas/list.h index f6ba29dae..aa674d25e 100644 --- a/include/villas/list.h +++ b/include/villas/list.h @@ -110,3 +110,10 @@ void list_sort(struct list *l, cmp_cb_t cmp); /** Set single element in list */ int list_set(struct list *l, int index, void *value); + +/** Return index in list for value. + * + * @retval <0 No list entry matching \p value was found. + * @retval >=0 Entry \p value was found at returned index. + */ +ssize_t list_index(struct list *l, void *value); diff --git a/lib/list.c b/lib/list.c index 2842c4223..34a4838a2 100644 --- a/lib/list.c +++ b/lib/list.c @@ -198,3 +198,27 @@ int list_set(struct list *l, int index, void *value) return 0; } + +ssize_t list_index(struct list *l, void *p) +{ + void *e; + ssize_t f; + + pthread_mutex_lock(&l->lock); + + assert(l->state == STATE_INITIALIZED); + + for (size_t i = 0; i < list_length(l); i++) { + e = list_at(l, i); + if (e == p) { + f = i; + goto found; + } + } + + f = -1; + +found: pthread_mutex_unlock(&l->lock); + + return f; +}