88 #include "gw-config.h" 115 #define INDEX(list, i) (((list)->start + i) % (list)->tab_size) 116 #define GET(list, i) ((list)->tab[INDEX(list, i)]) 131 list = gw_malloc(
sizeof(
List));
138 pthread_cond_init(&list->
nonempty, NULL);
152 if (destructor != NULL) {
154 for (i = 0; i < len; i++)
160 pthread_cond_destroy(&list->
nonempty);
185 pthread_cond_signal(&list->
nonempty);
197 for (i = 0; i < list->
len; ++i) {
203 if (i == list->
len) {
208 pthread_cond_signal(&list->
nonempty);
223 for (i = list->
len; i > pos; --i)
227 pthread_cond_signal(&list->
nonempty);
252 while (i < list->len) {
253 if (matches(
GET(list, i), pat)) {
278 while (i < list->len) {
279 if (
GET(list, i) == item) {
299 item =
GET(list, pos);
330 while (i < list->len) {
331 if (cmp(
GET(list, i), pat)) {
372 pthread_cleanup_pop(0);
406 pthread_cond_broadcast(&list->
nonempty);
438 pthread_cleanup_pop(0);
456 struct timespec abstime;
459 abstime.tv_sec = time(NULL) + sec;
467 rc = pthread_cond_timedwait(&list->
nonempty,
469 pthread_cleanup_pop(0);
493 for (i = 0; i < list->
len; ++i) {
495 if (cmp(item, pattern)) {
499 if (i == list->
len) {
518 for (i = 0; i < list->
len; ++i) {
520 if (cmp(item, pattern))
540 for (i = 0; i < list->
len; i++) {
541 if (
GET(list, i) == item) {
552 static void quicksort(
List *list,
long left,
long right,
int(*cmp)(
const void *,
const void *))
557 void *pivot =
GET(list, right);
560 while (cmp(
GET(list, l), pivot) < 0) l++;
561 while (cmp(
GET(list, r), pivot) > 0) r--;
563 void *swap =
GET(list, l);
564 GET(list, l) =
GET(list, r);
581 if (list->
len == 0) {
614 long old_size, new_size;
615 long len_at_beginning, len_at_end;
617 if (list->
len + items <= list->tab_size)
621 new_size = old_size + items;
622 list->
tab = gw_realloc(list->
tab, new_size *
sizeof(
void *));
666 (list->
start == 0 && old_size == 0));
667 if (list->
start + list->
len > old_size) {
668 len_at_end = old_size - list->
start;
669 len_at_beginning = list->
len - len_at_end;
670 if (len_at_beginning <= new_size - old_size) {
672 memmove(list->
tab + old_size,
674 len_at_beginning *
sizeof(
void *));
677 memmove(list->
tab + old_size,
679 (new_size - old_size) *
sizeof(
void *));
681 list->
tab + (new_size - old_size),
682 (len_at_beginning - (new_size - old_size))
724 }
else if (pos + count == list->
len) {
727 memmove(list->
tab + list->
start + pos,
728 list->
tab + list->
start + pos + count,
729 (list->
len - pos - count) *
sizeof(
void *));
737 for (i = 0; i < list->
len - count - pos; ++i) {
739 to =
INDEX(list, pos + i);
void * gwlist_search(List *list, void *pattern, int(*cmp)(void *, void *))
long gwlist_search_equal(List *list, void *item)
static void lock(List *list)
gw_assert(wtls_machine->packet_to_send !=NULL)
void gwlist_append(List *list, void *item)
void gwlist_produce(List *list, void *item)
long gwlist_len(List *list)
void * gwlist_get(List *list, long pos)
void gwlist_sort(List *list, int(*cmp)(const void *, const void *))
static void quicksort(List *list, long left, long right, int(*cmp)(const void *, const void *))
int gwlist_wait_until_nonempty(List *list)
List * gwlist_extract_matching(List *list, void *pat, gwlist_item_matches_t *cmp)
List * gwlist_search_all(List *list, void *pattern, int(*cmp)(void *, void *))
void gwlist_unlock(List *list)
List * gwlist_create_real(void)
void gwlist_item_destructor_t(void *item)
int gwlist_consumer_count(List *list)
void * gwlist_extract_first(List *list)
void gwlist_delete(List *list, long pos, long count)
void gwlist_remove_producer(List *list)
static void unlock(List *list)
Mutex * single_operation_lock
long gwlist_delete_equal(List *list, void *item)
static void delete_items_from_list(List *list, long pos, long count)
void mutex_destroy(Mutex *mutex)
void gwlist_insert(List *list, long pos, void *item)
void gwlist_lock(List *list)
long gwlist_delete_matching(List *list, void *pat, gwlist_item_matches_t *matches)
void gwlist_append_unique(List *list, void *item, int(*cmp)(void *, void *))
void * gwlist_consume(List *list)
int gwlist_item_matches_t(void *item, void *pattern)
static void make_bigger(List *list, long items)
void gwlist_add_producer(List *list)
void * gwlist_timed_consume(List *list, long sec)
int gwlist_producer_count(List *list)
void gwlist_destroy(List *list, gwlist_item_destructor_t *destructor)