X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Fprioq.c;h=8af4c51c2f751336e2822a44a1c12e2257960761;hp=fe91324d9b5790e9d93ebff317ef714eef4c9fd9;hb=2f07de3b6cacf44462635ab0fff56391b491e454;hpb=30bdd695250eeecbf0b36c1e3c90d67ca03953ed diff --git a/src/shared/prioq.c b/src/shared/prioq.c index fe91324d9..8af4c51c2 100644 --- a/src/shared/prioq.c +++ b/src/shared/prioq.c @@ -53,6 +53,19 @@ void prioq_free(Prioq *q) { free(q); } +int prioq_ensure_allocated(Prioq **q, compare_func_t compare_func) { + assert(q); + + if (*q) + return 0; + + *q = prioq_new(compare_func); + if (!*q) + return -ENOMEM; + + return 0; +} + static void swap(Prioq *q, unsigned j, unsigned k) { void *saved_data; unsigned *saved_idx; @@ -146,7 +159,7 @@ int prioq_put(Prioq *q, void *data, unsigned *idx) { unsigned n; struct prioq_item *j; - n = MAX((q->n_items+1) * 2, 16); + n = MAX((q->n_items+1) * 2, 16u); j = realloc(q->items, sizeof(struct prioq_item) * n); if (!j) return -ENOMEM; @@ -198,15 +211,19 @@ static void remove_item(Prioq *q, struct prioq_item *i) { } } -static struct prioq_item* find_item(Prioq *q, void *data, unsigned *idx) { +_pure_ static struct prioq_item* find_item(Prioq *q, void *data, unsigned *idx) { struct prioq_item *i; assert(q); if (idx) { - assert(*idx < q->n_items); + if (*idx == PRIOQ_IDX_NULL || + *idx > q->n_items) + return NULL; + i = q->items + *idx; - assert(i->data == data); + if (i->data != data) + return NULL; return i; } else { @@ -220,7 +237,8 @@ static struct prioq_item* find_item(Prioq *q, void *data, unsigned *idx) { int prioq_remove(Prioq *q, void *data, unsigned *idx) { struct prioq_item *i; - assert(q); + if (!q) + return 0; i = find_item(q, data, idx); if (!i) @@ -247,7 +265,9 @@ int prioq_reshuffle(Prioq *q, void *data, unsigned *idx) { } void *prioq_peek(Prioq *q) { - assert(q); + + if (!q) + return NULL; if (q->n_items <= 0) return NULL; @@ -258,7 +278,8 @@ void *prioq_peek(Prioq *q) { void *prioq_pop(Prioq *q) { void *data; - assert(q); + if (!q) + return NULL; if (q->n_items <= 0) return NULL; @@ -269,13 +290,17 @@ void *prioq_pop(Prioq *q) { } unsigned prioq_size(Prioq *q) { - assert(q); - return q->n_items; + if (!q) + return 0; + return q->n_items; } + bool prioq_isempty(Prioq *q) { - assert(q); + + if (!q) + return true; return q->n_items <= 0; }