67 #define NUM_PRODUCERS (4)    68 #define NUM_CONSUMERS (4)    69 #define NUM_ITEMS_PER_PRODUCER (1*1000)    91     item = gw_malloc(
sizeof(
Item));
   107     index = 
info->start_index;
   168                 error(0, 
"Not received: producer=%ld "   169                          "item=%ld index=%ld", 
   170                      tab[p].
id, n, index);
   177         panic(0, 
"Not all messages were received.");
   185     return strcmp(item, pat) == 0;
   190     static char *items[] = {
   195     int num_items = 
sizeof(items) / 
sizeof(items[0]);
   203     for (j = 0; j < num_repeats; ++j)
   204         for (i = 0; i < num_items; ++i)
   209         if (strcmp(p, items[0]) == 0)
   210             panic(0, 
"list contains `%s' after deleting it!",
   214     for (i = 0; i < num_items; ++i)
   217         panic(0, 
"list is not empty after deleting everything");
   224     static char *items[] = {
   229     int num_items = 
sizeof(items) / 
sizeof(items[0]);
   237     for (j = 0; j < num_repeats; ++j)
   238         for (i = 0; i < num_items; ++i)
   241     for (j = 0; j < num_items; ++j) {
   244         if (extracted == NULL)
   245             panic(0, 
"no extracted elements, should have!");
   248             if (strcmp(p, items[j]) == 0)
   249                 panic(0, 
"list contains `%s' after "   255             if (strcmp(p, items[j]) != 0)
   257                   "extraction returned wrong element!");
   263         panic(0, 
"list is not empty after extracting everything");
 void error(int err, const char *fmt,...)
 
void info(int err, const char *fmt,...)
 
void gwlist_append(List *list, void *item)
 
void gwlist_produce(List *list, void *item)
 
long gwlist_len(List *list)
 
static Item * new_item(long producer, long num, long index)
 
void * gwlist_get(List *list, long pos)
 
static void producer(void *arg)
 
List * gwlist_extract_matching(List *list, void *pat, gwlist_item_matches_t *cmp)
 
void gwthread_join_every(gwthread_func_t *func)
 
static char received[NUM_PRODUCERS *NUM_ITEMS_PER_PRODUCER]
 
#define NUM_ITEMS_PER_PRODUCER
 
static void main_for_list_add_and_delete(void)
 
void log_set_output_level(enum output_level level)
 
void gwlist_delete(List *list, long pos, long count)
 
static void main_for_extract(void)
 
void gwlist_remove_producer(List *list)
 
long gwlist_delete_equal(List *list, void *item)
 
void warning(int err, const char *fmt,...)
 
#define gwthread_create(func, arg)
 
static void init_received(void)
 
static void consumer(void *arg)
 
long gwlist_delete_matching(List *list, void *pat, gwlist_item_matches_t *matches)
 
void * gwlist_consume(List *list)
 
static int compare_cstr(void *item, void *pat)
 
void gwlib_shutdown(void)
 
static void main_for_producer_and_consumer(void)
 
void gwlist_add_producer(List *list)
 
void gwlist_destroy(List *list, gwlist_item_destructor_t *destructor)