00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "list.h"
00025 #include "../include/rwlock.h"
00026 #include <stdio.h>
00027 #include <stdlib.h>
00028
00029
00030
00031
00032
00033
00034 list_p ListInitialize(void)
00035 {
00036 list_p list;
00037
00038 list = (list_p)malloc(sizeof(list_t));
00039 list->size = 0;
00040 list->listhead = NULL;
00041 list->rwlock = rwlock_New();
00042
00043 return list;
00044 }
00045
00046
00047
00048
00049
00050
00051 void ListTerminate(list_p list)
00052 {
00053
00054 if(list->size > 0)
00055 {
00056 printf("ERROR: MEMORY leak Created \n");
00057 return;
00058 }
00059
00060
00061 if(list->listhead != NULL)
00062 free(list->listhead);
00063
00064 rwlock_Destroy(list->rwlock);
00065
00066
00067 free(list);
00068
00069 return;
00070 }
00071
00072 void ListClearCB(list_p list, ListElemDestroyFunc_t cb)
00073 {
00074 void* data;
00075 while( (data = ListPop(list)) != NULL) {
00076 cb(data);
00077 }
00078 }
00079
00080
00081
00082
00083
00084
00085 int ListGetSize(list_p list)
00086 {
00087 int size;
00088 size = list->size;
00089 return size;
00090 }
00091
00092 void* ListGetHead(list_p list)
00093 {
00094 void* node_data;
00095 node_data = list->listhead->node_data;
00096 return node_data;
00097 }
00098
00099
00100
00101
00102
00103
00104 void* ListPop(list_p list)
00105 {
00106 listNode_t *parsenode;
00107 void* data;
00108 parsenode = (listNode_t *)list->listhead;
00109
00110 if(list->listhead == NULL) {
00111 return NULL;
00112 }
00113
00114
00115 if(parsenode != NULL)
00116 {
00117 list->listhead = (listNode_t *)list->listhead->next;
00118 data = parsenode->node_data;
00119 free(parsenode);
00120 if(data == NULL)
00121 {
00122 printf("returning NULL data \n");
00123 exit(EXIT_FAILURE);
00124 }
00125 list->size--;
00126 return data;
00127 }
00128 else
00129 {
00130 return (void*)NULL;
00131 }
00132 }
00133
00134
00135
00136
00137
00138
00139 void* ListSearch(list_p list, const int index)
00140 {
00141
00142 listNode_t *parsenode;
00143 void* node_data;
00144 int i;
00145
00146
00147 if(list->listhead == NULL) {
00148 return NULL;
00149 }
00150
00151
00152 parsenode = list->listhead;
00153 i = 0;
00154
00155
00156 for(
00157 parsenode = (listNode_t *)list->listhead;
00158 parsenode != NULL;
00159 parsenode = (listNode_t *)parsenode->next
00160 )
00161 {
00162 if(i == index) {
00163 break;
00164 }
00165 if(i == list->size) {
00166 return NULL;
00167 }
00168 i++;
00169 }
00170
00171 if (parsenode == NULL) {
00172 return NULL;
00173 }
00174
00175
00176 node_data = parsenode->node_data;
00177 return node_data;
00178 }
00179
00180
00181
00182
00183
00184
00185 int ListAdd(list_p list, void* data)
00186 {
00187
00188 listNode_t *parsenode;
00189 listNode_t *new_listnode;
00190 parsenode = (listNode_t *) list->listhead;
00191
00192
00193 new_listnode = (listNode_t *)malloc(sizeof(listNode_t));
00194 new_listnode->node_data = data;
00195
00196
00197 if(list->listhead == NULL)
00198 {
00199 list->listhead = new_listnode;
00200 list->listhead->next = NULL;
00201 list->size = 1;
00202 return 0;
00203 }
00204
00205
00206 for(
00207 parsenode = (listNode_t *) list->listhead;
00208 parsenode->next != NULL;
00209 parsenode = (listNode_t *) parsenode->next
00210 );
00211
00212
00213 parsenode->next = (listNode_t *)new_listnode;
00214 new_listnode->next = NULL;
00215 list->size++;
00216
00217
00218 return 0;
00219 }
00220
00221 int ListAppend(list_p list, void* data)
00222 {
00223 listNode_p node;
00224
00225 if(list->listhead == NULL) {
00226 list->listhead = (listNode_p)malloc(sizeof(listNode_t));
00227 list->listhead->node_data = data;
00228 list->listhead->next = NULL;
00229 list->size = 1;
00230 return 0;
00231 }
00232
00233 node = list->listhead;
00234 while(node->next != NULL) {
00235 node = node->next;
00236 }
00237 node->next = (listNode_p)malloc(sizeof(listNode_t));
00238 node->next->next = NULL;
00239 node->next->node_data = data;
00240 list->size++;
00241 return 0;
00242 }
00243
00244
00245
00246
00247
00248
00249 int ListInsert(list_p list, void* data, const int index)
00250 {
00251
00252
00253
00254 return 0;
00255 }
00256
00257 list_p ListCopy(list_p list, void*(*data_copy_callback)(const void* data))
00258 {
00259 list_p newList = ListInitialize();
00260 listNode_p node;
00261 for(node = list->listhead; node!=NULL; node = node->next) {
00262 ListAppend(newList, data_copy_callback(node->node_data));
00263 }
00264 return newList;
00265 }
00266
00267
00268
00269
00270
00271
00272 void* ListDelete(list_p list, const int index)
00273 {
00274
00275 listNode_t *parsenode;
00276 int i;
00277 listNode_t *previous_parsenode;
00278 void* return_data;
00279 parsenode = list->listhead;
00280 previous_parsenode = NULL;
00281
00282
00283 if(index >= list->size || index < 0) {
00284 return NULL;
00285 }
00286
00287 if(index == 0)
00288 {
00289
00290 parsenode = list->listhead;
00291 list->listhead = list->listhead->next;
00292 list->size--;
00293 return_data = parsenode->node_data;
00294 } else {
00295
00296 for(i = 1; i < list->size && parsenode != NULL; i++)
00297 {
00298 previous_parsenode = parsenode;
00299 parsenode = (listNode_t *) parsenode->next;
00300 if(i == index)
00301 break;
00302 }
00303
00304
00305 previous_parsenode->next = parsenode->next;
00306
00307
00308 return_data = parsenode->node_data;
00309
00310 list->size--;
00311 }
00312
00313 free(parsenode);
00314
00315
00316 return return_data;
00317 }
00318
00319 void* ListSearchCB(list_p list, const void* key, ListSearchFunc_t cb)
00320 {
00321
00322 listNode_t *parsenode;
00323 void* node_data;
00324 int i;
00325
00326
00327
00328 if(list->listhead == NULL) {
00329 return NULL;
00330 }
00331
00332
00333 parsenode = list->listhead;
00334 i = 0;
00335
00336
00337 for(
00338 parsenode = (listNode_t *)list->listhead;
00339 parsenode != NULL;
00340 parsenode = (listNode_t *)parsenode->next
00341 )
00342 {
00343 if(!cb(key, parsenode->node_data)) {
00344
00345 break;
00346 }
00347 if(i == list->size) {
00348 return NULL;
00349 }
00350 i++;
00351 }
00352
00353 if (parsenode == NULL) {
00354 return NULL;
00355 }
00356
00357
00358 node_data = parsenode->node_data;
00359 return node_data;
00360 }
00361
00362 void* ListDeleteCB(list_p list, const void* key, ListSearchFunc_t cb)
00363 {
00364
00365 listNode_t *parsenode;
00366 listNode_t *lastparsenode;
00367 void* node_data;
00368
00369
00370
00371 if(list->listhead == NULL) {
00372 return NULL;
00373 }
00374
00375
00376 parsenode = list->listhead;
00377
00378
00379 if(!cb(key, parsenode->node_data)) {
00380 node_data = parsenode->node_data;
00381 list->listhead = parsenode->next;
00382 free(parsenode);
00383 list->size--;
00384 return node_data;
00385 }
00386
00387
00388 lastparsenode = parsenode;
00389 parsenode = parsenode->next;
00390 while(parsenode != NULL) {
00391 if(!cb(key, parsenode->node_data)) {
00392
00393 node_data = parsenode->node_data;
00394 lastparsenode->next = parsenode->next;
00395 free(parsenode);
00396 list->size--;
00397 return node_data;
00398 }
00399 }
00400 return NULL;
00401 }
00402
00403 void ListWait(list_p list)
00404 {
00405 rwlock_rdwait(list->rwlock);
00406 }
00407
00408 int ListForEachCB(list_p list, ListElemGenericFunc_t cb)
00409 {
00410 int retval;
00411 listNode_t* node;
00412 node = list->listhead;
00413 while(node != NULL) {
00414 if((retval = cb(node->node_data)) != 0) {
00415 return retval;
00416 }
00417 node = node->next;
00418 }
00419 return 0;
00420 }
00421
00422 void ListRDLock(list_p list)
00423 {
00424 rwlock_rdlock(list->rwlock);
00425 }
00426
00427 void ListRDUnlock(list_p list)
00428 {
00429 rwlock_rdunlock(list->rwlock);
00430 }
00431
00432 void ListWRLock(list_p list)
00433 {
00434 rwlock_wrlock(list->rwlock);
00435 }
00436
00437 void ListWRUnlock(list_p list)
00438 {
00439 rwlock_wrunlock(list->rwlock);
00440 }
00441
00442 void ListWRWait(list_p list)
00443 {
00444 COND_WAIT(list->rwlock->reader_cond, list->rwlock->lock);
00445 }
00446
00447 void ListRDWait(list_p list)
00448 {
00449 MUTEX_LOCK(list->rwlock->lock);
00450 list->rwlock->readers--;
00451 COND_WAIT(list->rwlock->reader_cond, list->rwlock->lock);
00452 list->rwlock->readers++;
00453 MUTEX_UNLOCK(list->rwlock->lock);
00454 }
00455
00456 void ListRDtoWR(list_p list)
00457 {
00458 MUTEX_LOCK(list->rwlock->lock);
00459 list->rwlock->readers--;
00460 while(list->rwlock->readers > 0) {
00461 COND_WAIT(list->rwlock->writer_cond, list->rwlock->lock);
00462 }
00463 }
00464
00465 void ListWRtoRD(list_p list)
00466 {
00467
00468 list->rwlock->readers++;
00469 MUTEX_UNLOCK(list->rwlock->lock);
00470 }