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

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  * list.h - generic dynamic list
  3.  *
  4.  * This is a generic, dynamic list. Generic means that it stores void pointers
  5.  * (void *), instead of a more specific data type. This allows storage of
  6.  * any type of items in the list. The pointers may not be NULL pointers.
  7.  *
  8.  * A number of operations are defined for the list: create, destroy,
  9.  * query of length, inserting and deleting items, getting items, and so on.
  10.  * See below for a detailed list.
  11.  *
  12.  * The list is also thread safe: each single operation is atomic. For
  13.  * list manipulation that needs to be atomic but uses several single
  14.  * operations, the list supports locking and unlocking. It is up to the
  15.  * caller to make sure the list lock is used properly; the implementation
  16.  * only guarantees the atomicity of single operations.
  17.  *
  18.  * The API also has functions for solving typical producer-consumer problems:
  19.  * the list counts the number of producers it has (they need to register
  20.  * _and_ unregister explicitly) and has functions for adding a produced
  21.  * item to the list and removing an item so that it can be consumed. The
  22.  * consumption function (`list_consume') sleeps, without using processor
  23.  * time, until there is an item to be consumed or there are no more
  24.  * producers. Thus, a typical producer would look like this:
  25.  *
  26.  * list_add_producer(list);
  27.  * while ((item = foo()) != NULL)
  28.  * list_produce(list, item);
  29.  * list_remove_producer(list);
  30.  *
  31.  * and the corresponding consumer would look like this:
  32.  *
  33.  * while ((item = list_consume(list)) != NULL)
  34.  * bar(item);
  35.  *
  36.  * There can be any number of producers and consumers at the same time.
  37.  *
  38.  * List items are numbered starting with `0'.
  39.  *
  40.  * Most list functions can do memory allocations. If these allocations
  41.  * fail, they will kill the program (they use gwlib/gwmem.c for
  42.  * memory allocations, and those do the killing). This is not mentioned
  43.  * explicitly for each function.
  44.  *
  45.  * The module prefix is `list' (in any combination of upper and lower case
  46.  * characters). All externally visible symbols (i.e., those defined by
  47.  * this header file) start with the prefix.
  48.  */
  49. #ifndef LIST_H
  50. #define LIST_H
  51. /*
  52.  * The list type. It is opaque: do not touch it except via the functions
  53.  * defined in this header.
  54.  */
  55. typedef struct List List;
  56. /*
  57.  * A comparison function for list items. Returns true (non-zero) for
  58.  * equal, false for non-equal. Gets an item from the list as the first
  59.  * argument, the pattern as a second argument.
  60.  */
  61. typedef int list_item_matches_t(void *item, void *pattern);
  62. /*
  63.  * A destructor function for list items.  Must free all memory associated
  64.  * with the list item.
  65.  */
  66. typedef void list_item_destructor_t(void *item);
  67. /*
  68.  * Create a list and return a pointer to the list object.
  69.  */
  70. List *list_create_real(void);
  71. #define list_create() gw_claim_area(list_create_real())
  72. /*
  73.  * Destroy the list. If `destructor' is not NULL, first destroy all items
  74.  * by calling it for each item. If it is NULL, the caller is responsible
  75.  * for destroying items. The caller is also responsible for making sure
  76.  * that nothing else tries to touch the list from the time the call to
  77.  * list_destroy starts - this includes the item destructor function.
  78.  */
  79. void list_destroy(List *list, list_item_destructor_t *destructor);
  80. /*
  81.  * Return the number of items in the list.  Return 0 if list is NULL.
  82.  */
  83. long list_len(List *list);
  84. /*
  85.  * Add a new item to the end of the list.
  86.  */
  87. void list_append(List *list, void *item);
  88. /*
  89.  * This is similar to list_append(). If the item is *not* present in the 
  90.  * list it is added to the end of the list, otherwise the item is 
  91.  * discarded and *not* added to the list. Hence you can assume that using
  92.  * this append function you result in a unique item inside the list.
  93.  */
  94. void list_append_unique(List *list, void *item, list_item_matches_t *cmp);
  95. /*
  96.  * Insert an item into the list so that it becomes item number `pos'.
  97.  */
  98. void list_insert(List *list, long pos, void *item);
  99. /*
  100.  * Delete items from the list. Note that this does _not_ free the memory
  101.  * for the items, they are just dropped from the list.
  102.  */
  103. void list_delete(List *list, long pos, long count);
  104. /*
  105.  * Delete all items from the list that match `pattern'. Like list_delete,
  106.  * the items are removed from the list, but are not destroyed themselves.
  107.  * Return the number of items deleted.
  108.  */
  109. long list_delete_matching(List *list, void *pat, list_item_matches_t *cmp);
  110. /*
  111.  * Delete all items from the list whose pointer value is exactly `item'.
  112.  * Return the number of items deleted.
  113.  */
  114. long list_delete_equal(List *list, void *item);
  115. /*
  116.  * Return the item at position `pos'.
  117.  */
  118. void *list_get(List *list, long pos);
  119. /*
  120.  * Remove and return the first item in the list. Return NULL if list is
  121.  * empty. Note that unlike list_consume, this won't sleep until there is
  122.  * something in the list.
  123.  */
  124. void *list_extract_first(List *list);
  125. /*
  126.  * Create a new list with items from `list' that match a pattern. The items
  127.  * are removed from `list'. Return NULL if no matching items are found.
  128.  * Note that unlike list_consume, this won't sleep until there is
  129.  * something in the list.
  130.  */
  131. List *list_extract_matching(List *list, void *pat, list_item_matches_t *cmp);
  132. /*
  133.  * Lock the list. This protects the list from other threads that also
  134.  * lock the list with list_lock, but not from threads that do not.
  135.  * (This is intentional.)
  136.  */
  137. void list_lock(List *list);
  138. /*
  139.  * Unlock the list lock locked by list_lock. Only the owner of the lock
  140.  * may unlock it (although this might not be checked).
  141.  */
  142. void list_unlock(List *list);
  143. /*
  144.  * Sleep until the list is non-empty. Note that after the thread awakes
  145.  * another thread may already have emptied the list again. Those who wish
  146.  * to use this function need to be very careful with list_lock and
  147.  * list_unlock.
  148.  */
  149. int list_wait_until_nonempty(List *list);
  150. /*
  151.  * Register a new producer to the list.
  152.  */
  153. void list_add_producer(List *list);
  154. /*
  155.  * Return the current number of producers for the list
  156.  */
  157. int list_producer_count(List *list);
  158. /*
  159.  * Remove a producer from the list. If the number of producers drops to
  160.  * zero, all threads sleeping in list_consume will awake and return NULL.
  161.  */
  162. void list_remove_producer(List *list);
  163. /*
  164.  * Add an item to the list. This equivalent to list_append, but may be
  165.  * easier to remember.
  166.  */
  167. void list_produce(List *list, void *item);
  168. /*
  169.  * Remove an item from the list, or return NULL if the list was empty
  170.  * and there were no producers. If the list is empty but there are
  171.  * producers, sleep until there is something to return.
  172.  */
  173. void *list_consume(List *list);
  174. /*
  175.  * Search the list for a particular item. If not found, return NULL. If found,
  176.  * return the list element. Compare items to search pattern with 
  177.  * `cmp(item, pattern)'. If the function returns non-zero, the items are 
  178.  * equal.
  179.  */
  180. void *list_search(List *list, void *pattern, list_item_matches_t *cmp);
  181. /*
  182.  * Search the list for all items matching a pattern. If not found, return 
  183.  * NULL. If found, return a list with the matching elements. Compare items
  184.  * to search pattern with `cmp(item, pattern)'. If the function returns 
  185.  * non-zero, the items are equal.
  186.  */
  187. List *list_search_all(List *list, void *pattern, list_item_matches_t *cmp);
  188. #endif