00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef _AP_QUEUE_TEMPLATE_H_
00036 #define _AP_QUEUE_TEMPLATE_H_
00037 #include "macros.h"
00038 #include "mc_error.h"
00039 #include <embedch.h>
00040
00041 struct AP_GENERIC_s {void* none;};
00042 typedef struct AP_GENERIC_s AP_GENERIC_t;
00043 typedef AP_GENERIC_t* AP_GENERIC_p;
00044
00045
00046 #define AP_QUEUE_DECL_TEMPLATE( name, node_type) \
00047 typedef struct name##_s \
00048 { \
00049 int size; \
00050 list_p list; \
00051 MUTEX_T* lock; \
00052 COND_T* cond; \
00053 } name##_t; \
00054 \
00055 typedef name##_t* name##_p; \
00056 \
00057 name##_p name##_New( void ); \
00058 int name##_Destroy( name##_p name ); \
00059 int name##_Add( name##_p name, struct node_type##_s* node ); \
00060 name##_p name##_Copy(name##_p name); \
00061 int name##_GetSize(name##_p name); \
00062 struct node_type##_s* name##_Pop( name##_p name ); \
00063 struct node_type##_s* name##_WaitPop( name##_p name ); \
00064 struct node_type##_s* name##_SearchIndex( name##_p name, int index ); \
00065 int name##_RemoveIndex(name##_p name, int index);
00066
00067 #define AP_QUEUE_GENERIC_DECL_TEMPLATE(name, func_name, return_type, search_type) \
00068 return_type name##_##func_name(name##_p name, const search_type key);
00069
00070 #define AP_QUEUE_STD_DEFN_TEMPLATE( name, node_type) \
00071 name##_p name##_New( void ) \
00072 { \
00073 name##_p temp; \
00074 temp = (name##_p)malloc(sizeof(name##_t)); \
00075 temp->size = 0; \
00076 temp->list = ListInitialize(); \
00077 \
00078 temp->lock = (MUTEX_T*)malloc(sizeof(MUTEX_T)); \
00079 temp->cond = (COND_T*)malloc(sizeof(COND_T)); \
00080 MUTEX_INIT(temp->lock); \
00081 COND_INIT(temp->cond); \
00082 return temp; \
00083 } \
00084 \
00085 int name##_Destroy( name##_p name ) \
00086 { \
00087 struct node_type##_s* node; \
00088 while ((node = (node_type##_t*)name##_Pop(name)) != NULL) { \
00089 node_type##_Destroy(node); \
00090 } \
00091 ListTerminate(name->list); \
00092 MUTEX_DESTROY(name->lock); \
00093 COND_DESTROY(name->cond); \
00094 free(name->lock); \
00095 free(name->cond); \
00096 free(name); \
00097 return 0; \
00098 } \
00099 \
00100 name##_p name##_Copy(name##_p name) \
00101 { \
00102 int i;\
00103 name##_p temp; \
00104 struct node_type##_s* temp_node; \
00105 temp = (name##_p)malloc(sizeof(name##_t)); \
00106 if (temp == NULL) { \
00107 fprintf(stderr, "Memory Error at %s:%d\n", __FILE__, __LINE__); \
00108 exit(0); \
00109 } \
00110 temp->size = 0; \
00111 temp->list = ListInitialize(); \
00112 temp->lock = (MUTEX_T*)malloc(sizeof(MUTEX_T)); \
00113 if (temp->lock == NULL) { \
00114 fprintf(stderr, "Memory Error at %s:%d\n", __FILE__, __LINE__); \
00115 exit(0); \
00116 } \
00117 temp->cond = (COND_T*)malloc(sizeof(COND_T)); \
00118 if(temp->cond == NULL) { \
00119 fprintf(stderr, "Memory Error at %s:%d\n", __FILE__, __LINE__); \
00120 exit(0); \
00121 } \
00122 MUTEX_INIT(temp->lock); \
00123 COND_INIT(temp->cond); \
00124 for( \
00125 i = 0; \
00126 (temp_node = (node_type##_t*)name##_SearchIndex(name, i)) != NULL; \
00127 i++ \
00128 ) \
00129 { \
00130 name##_Add(temp, node_type##_Copy(temp_node)); \
00131 } \
00132 return temp; \
00133 } \
00134 \
00135 int name##_GetSize( name##_p name ) \
00136 { \
00137 int size; \
00138 MUTEX_LOCK(name->lock); \
00139 size = name->size; \
00140 MUTEX_UNLOCK(name->lock); \
00141 return size; \
00142 } \
00143 \
00144 int name##_Add( name##_p name, node_type##_t* node ) \
00145 { \
00146 MUTEX_LOCK(name->lock); \
00147 ListAdd(name->list, node); \
00148 name->size++; \
00149 COND_SIGNAL(name->cond); \
00150 MUTEX_UNLOCK(name->lock); \
00151 return 0; \
00152 } \
00153 \
00154 node_type##_t* name##_Pop( name##_p name ) \
00155 { \
00156 struct node_type##_s* ret; \
00157 MUTEX_LOCK(name->lock); \
00158 if (name->size <= 0) { \
00159 MUTEX_UNLOCK(name->lock); \
00160 return NULL; \
00161 } \
00162 ret = (node_type##_t*)ListPop(name->list); \
00163 name->size--; \
00164 COND_SIGNAL(name->cond); \
00165 MUTEX_UNLOCK(name->lock); \
00166 return ret; \
00167 } \
00168 \
00169 node_type##_t* name##_WaitPop( name##_p name ) \
00170 { \
00171 struct node_type##_s* ret; \
00172 MUTEX_LOCK(name->lock); \
00173 while (name->size <= 0) { \
00174 COND_WAIT(name->cond, name->lock); \
00175 } \
00176 ret = (node_type##_t*)ListPop(name->list); \
00177 name->size--; \
00178 COND_SIGNAL(name->cond); \
00179 MUTEX_UNLOCK(name->lock); \
00180 return ret; \
00181 } \
00182 \
00183 struct node_type##_s* name##_SearchIndex( name##_p name, int index ) \
00184 { \
00185 struct node_type##_s* node; \
00186 MUTEX_LOCK(name->lock); \
00187 node = (node_type##_t*)ListSearch(name->list, index); \
00188 MUTEX_UNLOCK(name->lock); \
00189 return node; \
00190 } \
00191 \
00192 int name##_RemoveIndex( name##_p name, int index ) \
00193 { \
00194 struct node_type##_s* node; \
00195 MUTEX_LOCK(name->lock); \
00196 node = (node_type##_t*)ListDelete(name->list, index); \
00197 node_type##_Destroy(node); \
00198 name->size--; \
00199 MUTEX_UNLOCK(name->lock); \
00200 return 0; \
00201 }
00202
00203 #define AP_QUEUE_SEARCH_TEMPLATE( name, func_name, node_type, \
00204 search_type, search_expression ) \
00205 struct node_type##_s* name##_##func_name( name##_p name, const search_type key ) \
00206 { \
00207 listNode_t* parsenode; \
00208 struct node_type##_s* node; \
00209 struct node_type##_s* ret = NULL; \
00210 node = NULL; \
00211 \
00212 MUTEX_LOCK(name->lock); \
00213 if (name->list->listhead == NULL) { \
00214 MUTEX_UNLOCK(name->lock); \
00215 return NULL; \
00216 } \
00217 for( \
00218 parsenode = (listNode_t*)name->list->listhead; \
00219 parsenode != NULL; \
00220 parsenode = (listNode_t*)parsenode->next \
00221 ) \
00222 { \
00223 node = (node_type##_t*)parsenode->node_data; \
00224 if (search_expression){ \
00225 ret = node; \
00226 break; \
00227 } \
00228 } \
00229 MUTEX_UNLOCK(name->lock); \
00230 return ret; \
00231 }
00232
00233 #define AP_QUEUE_REMOVE_TEMPLATE( name, func_name, node_type, \
00234 search_type, search_expression) \
00235 int name##_##func_name( name##_p name, const search_type key ) \
00236 { \
00237 int err_code = MC_ERR_NOT_FOUND; \
00238 struct listNode_s* parsenode; \
00239 struct node_type##_s* node; \
00240 node = NULL; \
00241 \
00242 MUTEX_LOCK(name->lock); \
00243 if (name->list->listhead == NULL) { \
00244 MUTEX_UNLOCK(name->lock); \
00245 return MC_ERR_NOT_FOUND; \
00246 } \
00247 for( \
00248 parsenode = (listNode_t*)name->list->listhead; \
00249 parsenode->next != NULL; \
00250 parsenode = (listNode_t*)parsenode->next \
00251 ) \
00252 { \
00253 node = (node_type##_t*)parsenode->node_data; \
00254 if (search_expression) { \
00255 break; \
00256 err_code = MC_SUCCESS; \
00257 } \
00258 } \
00259 MUTEX_UNLOCK(name->lock); \
00260 return err_code; \
00261 }
00262
00263
00264 struct interpreter_queue_s;
00265 AP_GENERIC_p interpreter_queue_CreateRetrieve( struct interpreter_queue_s *queue, ChOptions_t* interp_options );
00266 #endif