00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef LIST_H
00025 #define LIST_H
00026
00027 #include<stdio.h>
00028 #include<stdlib.h>
00029
00030 #define DATA void*
00031
00032 typedef struct listNode_s{
00033
00034 DATA node_data;
00035 struct listNode_s *next;
00036
00037 }listNode_t;
00038
00039 typedef listNode_t* listNode_p;
00040
00041 typedef struct list_s{
00042
00043 listNode_p listhead;
00044 int size;
00045
00046 }list_t;
00047
00048
00049 typedef list_t* list_p;
00050
00051
00052 list_p ListInitialize(void);
00053
00054 void ListTerminate(list_p list);
00055
00056
00057 int ListGetSize(list_p list);
00058 int ListAdd(list_p list, DATA data);
00059 int ListInsert(list_p list, DATA data, const int index);
00060
00061
00062 DATA ListGetHead(list_p list);
00063 DATA ListPop(list_p list);
00064 DATA ListSearch(list_p list, const int index);
00065 DATA ListDelete(list_p list, const int index);
00066
00067
00068 #define QUEUE_TEMPLATE( name, node_type, search_type, search_var_name ) \
00069 typedef struct name##_s name \
00070 { \
00071 int size; \
00072 list_p list; \
00073 MUTEX_T* lock; \
00074 COND_T* cond; \
00075 } name##_t; \
00076 \
00077 typedef name##_t* name##_p; \
00078 \
00079 name##_p name##Initialize( void ); \
00080 void name##Destroy( name##_p name ); \
00081 int name##Add( name##_p name, node_type ); \
00082 name##_p name##Pop( name##_p name ); \
00083 name##_p name##Search( name##_p name, search_type key ); \
00084 int name##Remove(name##_p name, search_type key ); \
00085 name##_p name##SearchIndex( name##_p name, int index ); \
00086 int name##RemoveIndex(name##_p name, int index); \
00087 \
00088 name##_p name##Initialize( void ) \
00089 { \
00090 name##_p temp; \
00091 temp = (name##_p)malloc(sizeof(name##_t)); \
00092 temp->size = 0; \
00093 temp->list = ListInitialize(); \
00094 \
00095 temp->lock = (MUTEX_T*)malloc(sizeof(MUTEX_T)); \
00096 temp->cond = (COND_T*)malloc(sizeof(COND_T)); \
00097 return temp; \
00098 } \
00099 \
00100 int name##Destroy( name##_p name ) \
00101 { \
00102 ListTerminate(name->list); \
00103 MUTEX_DESTROY(name->lock); \
00104 COND_DESTROY(name->cond); \
00105 free(name->lock); \
00106 free(name->cond); \
00107 return 0; \
00108 } \
00109 \
00110 int name##Add( name##_p name, node_type* node ) \
00111 { \
00112 MUTEX_LOCK(name->lock); \
00113 ListAdd(name->list, node); \
00114 name->size++; \
00115 COND_SIGNAL(name->cond); \
00116 MUTEX_UNLOCK(name->lock); \
00117 return 0; \
00118 } \
00119 \
00120 node_type* name##Pop( name##_p name ) \
00121 { \
00122 node_type *ret; \
00123 MUTEX_LOCK(name->lock); \
00124 ret = ListPop(name->list); \
00125 name->size--; \
00126 COND_SIGNAL(name->cond); \
00127 MUTEX_UNLOCK(name->lock); \
00128 return ret; \
00129 } \
00130 \
00131 node_type* name##Search( name##_p name, search_type value ) \
00132 { \
00133 listNode_t* parsenode; \
00134 node_type* node; \
00135 node = NULL; \
00136 \
00137 MUTEX_LOCK(name->lock); \
00138 if (name->list->listhead == NULL) { \
00139 MUTEX_UNLOCK(name->lock); \
00140 return NULL; \
00141 } \
00142 for( \
00143 parsenode = (listNode_t*)name->list->listhead; \
00144 parsenode->next != NULL; \
00145 parsenode = (listNode_t*)parsenode->next \
00146 ) \
00147 { \
00148 node = (node_type*)parsenode->node_data; \
00149 if (node->search_var_name == value ) \
00150 break; \
00151 } \
00152 MUTEX_UNLOCK(name->lock); \
00153 return node; \
00154 } \
00155 \
00156 int name##Remove( name##_p name, search_type key ) \
00157 { \
00158 listNode_t* parsenode; \
00159 node_type* node; \
00160 node = NULL; \
00161 \
00162 MUTEX_LOCK(name->lock); \
00163 if (name->list->listhead == NULL) { \
00164 MUTEX_UNLOCK(name->lock); \
00165 return MC_ERR_NOT_FOUND; \
00166 } \
00167 for( \
00168 parsenode = (listNode_t*)name->list->listhead; \
00169 parsenode->next != NULL; \
00170 parsenode = (listNode_t*)parsenode->next \
00171 ) \
00172 { \
00173 node = (node_type*)parsenode->node_data; \
00174 if (node->search_var_name == key) \
00175 break; \
00176 } \
00177 MUTEX_UNLOCK(name->lock); \
00178 } \
00179 \
00180 name##_p name##SearchIndex( name##_p name, int index ) \
00181 { \
00182 node_type* node; \
00183 MUTEX_LOCK(name->lock); \
00184 node = (node_type*)ListSearch(name->list, index); \
00185 MUTEX_UNLOCK(name->lock); \
00186 return node; \
00187 } \
00188 \
00189 int name##RemoveIndex( name##_p name, int index ) \
00190 { \
00191 node_type* node; \
00192 MUTEX_LOCK(name->lock); \
00193 node = ListDelete(name->list, index); \
00194 node_type##Destroy(node); \
00195 MUTEX_UNLOCK(name->lock); \
00196 return 0; \
00197 }
00198
00199 #endif