#include #include #include #include #include "LinkedList.h" LinkedList *newLL() { Element *e = NULL; LinkedList *l = malloc(sizeof(LinkedList)); assert(l != NULL); // In the list, we add two markers which will simplify add and // remove algorithms e = malloc(sizeof(Element)); assert(e != NULL); e->val = INT_MIN; pthread_mutex_init(&(e->mutex),NULL); l->first = e; e = malloc(sizeof(Element)); assert(e != NULL); pthread_mutex_init(&(e->mutex),NULL); e->val = INT_MAX; l->first->next = e; l->first->next->next = NULL; return l; } void dumpLL(LinkedList *l) { Element *e = l->first->next; printf("Begin dump LinkedList %p\n", l); MUTEX_LOCK(e->mutex); while (e->val != INT_MAX) { printf(" val = %8d\n", e->val); MUTEX_LOCK(e->next->mutex); MUTEX_UNLOCK(e->mutex); e = e->next; } MUTEX_UNLOCK(e->mutex); printf("End dump LinkedList %p\n", l); } int sizeLL(LinkedList *l) { Element *e = l->first->next; int nb = 0; MUTEX_LOCK(e->mutex); while (e->val != INT_MAX) { ++nb; MUTEX_LOCK(e->next->mutex); MUTEX_UNLOCK(e->mutex); e = e->next; } MUTEX_UNLOCK(e->mutex); return nb; } void freeLL(LinkedList *l) { Element *e = l->first; // We free all the elements inside the list do { Element *nextE = e->next; int rc = pthread_mutex_destroy(&(e->mutex)); assert(rc == 0); free(e); e = nextE; } while (e != NULL); // We free the LinkedList itself free(l); } void addLL(LinkedList *l, int v) { Element *e = l->first; Element *newE = NULL; assert(v != INT_MIN && v!= INT_MAX); MUTEX_LOCK(e->mutex); MUTEX_LOCK(e->next->mutex); // We look where to insert our value while (v > e->next->val) { Element *nextE = e->next; MUTEX_LOCK(nextE->next->mutex); MUTEX_UNLOCK(e->mutex); e = nextE; } // We insert the new element in the list between e and e->next newE = malloc(sizeof(Element)); assert(newE != NULL); newE->val = v; newE->next = e->next; pthread_mutex_init(&(newE->mutex),NULL); e->next = newE; MUTEX_UNLOCK(newE->next->mutex); MUTEX_UNLOCK(e->mutex); } void removeLL(LinkedList *l, int v) { Element *e = l->first; assert(v != INT_MIN && v!= INT_MAX); MUTEX_LOCK(e->mutex); MUTEX_LOCK(e->next->mutex); // We look for the value to suppress while (v > e->next->val) { Element *nextE = e->next; MUTEX_LOCK(nextE->next->mutex); MUTEX_UNLOCK(e->mutex); e = nextE; } if (v == e->next->val) { // The value we need to remove is contained in e->next Element *eToRemove = e->next; int rc; e->next = eToRemove->next; eToRemove->next = NULL; MUTEX_UNLOCK(eToRemove->mutex); rc = pthread_mutex_destroy(&(eToRemove->mutex)); assert(rc == 0); free(eToRemove); MUTEX_UNLOCK(e->mutex); } else { fprintf(stderr, "WARNING : value %d not found in list %p\n", v, l); } }