gw_prioqueue_t *gw_prioqueue_create(int(*cmp)(const void*, const void *)) { gw_prioqueue_t *ret; gw_assert(cmp != NULL); ret = gw_malloc(sizeof(*ret)); ret->producers = 0; pthread_cond_init(&ret->nonempty, NULL); ret->mutex = mutex_create(); ret->tab = NULL; ret->size = 0; ret->len = 0; ret->seq = 0; ret->cmp = cmp; /* put NULL item at pos 0 that is our stop marker */ make_bigger(ret, 1); ret->tab[0] = gw_malloc(sizeof(**ret->tab)); ret->tab[0]->item = NULL; ret->tab[0]->seq = ret->seq++; ret->len++; return ret; }
void list_append(List *list, void *item) { lock(list); make_bigger(list, 1); list->tab[INDEX(list, list->len)] = item; ++list->len; pthread_cond_signal(&list->nonempty); unlock(list); }
void gw_prioqueue_insert(gw_prioqueue_t *queue, void *item) { gw_assert(queue != NULL); gw_assert(item != NULL); queue_lock(queue); make_bigger(queue, 1); queue->tab[queue->len] = gw_malloc(sizeof(**queue->tab)); queue->tab[queue->len]->item = item; queue->tab[queue->len]->seq = queue->seq++; upheap(queue, queue->len); queue->len++; pthread_cond_signal(&queue->nonempty); queue_unlock(queue); }
void gwlist_insert(List *list, long pos, void *item) { long i; lock(list); gw_assert(pos >= 0); gw_assert(pos <= list->len); make_bigger(list, 1); for (i = list->len; i > pos; --i) list->tab[INDEX(list, i)] = GET(list, i - 1); list->tab[INDEX(list, pos)] = item; ++list->len; pthread_cond_signal(&list->nonempty); unlock(list); }
void list_insert(List *list, long pos, void *item) { long i; lock(list); gw_assert(pos >= 0); gw_assert(pos <= list->len); make_bigger(list, 1); for (i = list->len; i > pos; --i) list->tab[(list->start + i) % list->tab_size] = list->tab[(list->start + i - 1) % list->tab_size]; list->tab[(list->start + pos) % list->tab_size] = item; ++list->len; pthread_cond_signal(&list->nonempty); unlock(list); }
void list_append_unique(List *list, void *item, int (*cmp)(void *, void *)) { void *it; long i; lock(list); it = NULL; for (i = 0; i < list->len; ++i) { it = GET(list, i); if (cmp(it, item)) { break; } } if (i == list->len) { /* not yet in list, so add it */ make_bigger(list, 1); list->tab[INDEX(list, list->len)] = item; ++list->len; pthread_cond_signal(&list->nonempty); } unlock(list); }