check_list.c
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:4k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  * check_list.c - check that gwlib/list.c works
  3.  */
  4.  
  5. #include <string.h>
  6. #include <unistd.h>
  7. #include <signal.h>
  8. #include "gwlib/gwlib.h"
  9. #define NUM_PRODUCERS (4)
  10. #define NUM_CONSUMERS (4)
  11. #define NUM_ITEMS_PER_PRODUCER (1*1000)
  12. struct producer_info {
  13.     List *list;
  14.     long start_index;
  15.     long id;
  16. };
  17. static char received[NUM_PRODUCERS * NUM_ITEMS_PER_PRODUCER];
  18. typedef struct {
  19. long producer;
  20. long num;
  21. long index;
  22. } Item;
  23. static Item *new_item(long producer, long num, long index) {
  24. Item *item;
  25. item = gw_malloc(sizeof(Item));
  26. item->producer = producer;
  27. item->num = num;
  28. item->index = index;
  29. return item;
  30. }
  31. static void producer(void *arg) {
  32. long i, index;
  33. long id;
  34. struct producer_info *info;
  35. info = arg;
  36. id = gwthread_self();
  37. index = info->start_index;
  38. for (i = 0; i < NUM_ITEMS_PER_PRODUCER; ++i, ++index)
  39. list_produce(info->list, new_item(id, i, index));
  40. list_remove_producer(info->list);
  41. }
  42. static void consumer(void *arg) {
  43. List *list;
  44. Item *item;
  45. list = arg;
  46. for (;;) {
  47. item = list_consume(list);
  48. if (item == NULL)
  49. break;
  50. received[item->index] = 1;
  51. gw_free(item);
  52. }
  53. }
  54. static void init_received(void) {
  55. memset(received, 0, sizeof(received));
  56. }
  57. static void main_for_producer_and_consumer(void) {
  58. List *list;
  59. int i;
  60. Item *item;
  61. struct producer_info tab[NUM_PRODUCERS];
  62. long p, n, index;
  63. int errors;
  64. list = list_create();
  65. init_received();
  66. for (i = 0; i < NUM_PRODUCERS; ++i) {
  67.      tab[i].list = list;
  68. tab[i].start_index = i * NUM_ITEMS_PER_PRODUCER;
  69.      list_add_producer(list);
  70. tab[i].id = gwthread_create(producer, tab + i);
  71. }
  72. for (i = 0; i < NUM_CONSUMERS; ++i)
  73. gwthread_create(consumer, list);
  74.      gwthread_join_every(producer);
  75.      gwthread_join_every(consumer);
  76. while (list_len(list) > 0) {
  77. item = list_get(list, 0);
  78. list_delete(list, 0, 1);
  79. warning(0, "main: %ld %ld %ld", (long) item->producer, 
  80. item->num, item->index);
  81. }
  82. errors = 0;
  83. for (p = 0; p < NUM_PRODUCERS; ++p) {
  84. for (n = 0; n < NUM_ITEMS_PER_PRODUCER; ++n) {
  85. index = p * NUM_ITEMS_PER_PRODUCER + n;
  86. if (!received[index]) {
  87. error(0, "Not received: producer=%ld "
  88.          "item=%ld index=%ld", 
  89.  tab[p].id, n, index);
  90. errors = 1;
  91. }
  92. }
  93. }
  94. if (errors)
  95. panic(0, "Not all messages were received.");
  96. }
  97. static int compare_cstr(void *item, void *pat) {
  98.      /* Remove a macro definition of strcmp to prevent warnings from
  99.  * a broken version in the glibc libary. */
  100. #undef strcmp
  101. return strcmp(item, pat) == 0;
  102. }
  103. static void main_for_list_add_and_delete(void) {
  104. static char *items[] = {
  105. "one",
  106. "two",
  107. "three",
  108. };
  109. int num_items = sizeof(items) / sizeof(items[0]);
  110. int num_repeats = 3;
  111. int i, j;
  112. char *p;
  113. List *list;
  114. list = list_create();
  115. for (j = 0; j < num_repeats; ++j)
  116. for (i = 0; i < num_items; ++i)
  117. list_append(list, items[i]);
  118. list_delete_matching(list, items[0], compare_cstr);
  119. for (i = 0; i < list_len(list); ++i) {
  120. p = list_get(list, i);
  121. if (strcmp(p, items[0]) == 0)
  122. panic(0, "list contains `%s' after deleting it!",
  123. items[0]);
  124. }
  125. for (i = 0; i < num_items; ++i)
  126. list_delete_equal(list, items[i]);
  127. if (list_len(list) != 0)
  128. panic(0, "list is not empty after deleting everything");
  129. list_destroy(list, NULL);
  130. }
  131. static void main_for_extract(void) {
  132. static char *items[] = {
  133. "one",
  134. "two",
  135. "three",
  136. };
  137. int num_items = sizeof(items) / sizeof(items[0]);
  138. int num_repeats = 3;
  139. int i, j;
  140. char *p;
  141. List *list, *extracted;
  142. list = list_create();
  143. for (j = 0; j < num_repeats; ++j)
  144. for (i = 0; i < num_items; ++i)
  145. list_append(list, items[i]);
  146. for (j = 0; j < num_items; ++j) {
  147. extracted = list_extract_matching(list, items[j], 
  148. compare_cstr);
  149. if (extracted == NULL)
  150. panic(0, "no extracted elements, should have!");
  151. for (i = 0; i < list_len(list); ++i) {
  152. p = list_get(list, i);
  153. if (strcmp(p, items[j]) == 0)
  154. panic(0, "list contains `%s' after "
  155.          "extracting it!",
  156. items[j]);
  157. }
  158. for (i = 0; i < list_len(extracted); ++i) {
  159. p = list_get(extracted, i);
  160. if (strcmp(p, items[j]) != 0)
  161. panic(0, 
  162.   "extraction returned wrong element!");
  163. }
  164. list_destroy(extracted, NULL);
  165. }
  166. if (list_len(list) != 0)
  167. panic(0, "list is not empty after extracting everything");
  168. list_destroy(list, NULL);
  169. }
  170. int main(void) {
  171. gwlib_init();
  172. log_set_output_level(GW_INFO);
  173. main_for_list_add_and_delete();
  174. main_for_extract();
  175. main_for_producer_and_consumer();
  176. gwlib_shutdown();
  177. return 0;
  178. }