PUD: add mutex to dedup list
authorFerry Huberts <f.huberts@mindef.nl>
Tue, 11 Oct 2011 11:26:16 +0000 (13:26 +0200)
committerFerry Huberts <f.huberts@mindef.nl>
Tue, 18 Oct 2011 10:08:27 +0000 (12:08 +0200)
Signed-off-by: Ferry Huberts <f.huberts@mindef.nl>
lib/pud/src/dedup.c
lib/pud/src/dedup.h

index 38cb3b6..f918f6a 100644 (file)
@@ -7,6 +7,7 @@
 
 /* System includes */
 #include <assert.h>
+#include <pthread.h>
 
 #ifdef PUD_DUMP_DEDUP
 #include <arpa/inet.h>
@@ -34,6 +35,7 @@
  - true otherwise
  */
 bool initDeDupList(DeDupList * deDupList, unsigned long long maxEntries) {
+       pthread_mutexattr_t attr;
        void * p;
 
        if (deDupList == NULL) {
@@ -43,6 +45,16 @@ bool initDeDupList(DeDupList * deDupList, unsigned long long maxEntries) {
                return false;
        }
 
+       if (pthread_mutexattr_init(&attr)) {
+               return false;
+       }
+       if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP)) {
+               return false;
+       }
+       if (pthread_mutex_init(&deDupList->mutex, &attr)) {
+               return false;
+       }
+
        p = olsr_malloc(maxEntries * sizeof(DeDupEntry),
                        "DeDupEntry entries for DeDupList (PUD)");
        if (p == NULL) {
@@ -67,6 +79,8 @@ bool initDeDupList(DeDupList * deDupList, unsigned long long maxEntries) {
 void destroyDeDupList(DeDupList * deDupList) {
        assert (deDupList != NULL);
 
+       (void) pthread_mutex_lock(&deDupList->mutex);
+
        if (deDupList->entries != NULL) {
                free(deDupList->entries);
                deDupList->entries = NULL;
@@ -76,6 +90,10 @@ void destroyDeDupList(DeDupList * deDupList) {
 
        deDupList->entriesCount = 0;
        deDupList->newestEntryIndex = 0;
+
+       (void) pthread_mutex_unlock(&deDupList->mutex);
+
+       pthread_mutex_destroy(&deDupList->mutex);
 }
 
 /**
@@ -92,6 +110,8 @@ void addToDeDup(DeDupList * deDupList, union olsr_message *olsrMessage) {
 
        assert (deDupList != NULL);
 
+       (void) pthread_mutex_lock(&deDupList->mutex);
+
        incomingIndex = INCOMINGINDEX(deDupList);
        newEntry = &deDupList->entries[incomingIndex];
 
@@ -129,6 +149,8 @@ void addToDeDup(DeDupList * deDupList, union olsr_message *olsrMessage) {
                                deDupList->newestEntryIndex, INCOMINGINDEX(deDupList));
        }
 #endif
+
+       (void) pthread_mutex_unlock(&deDupList->mutex);
 }
 
 /**
@@ -146,8 +168,13 @@ void addToDeDup(DeDupList * deDupList, union olsr_message *olsrMessage) {
  */
 bool isInDeDupList(DeDupList * deDupList, union olsr_message *olsrMessage) {
        bool retval = false;
-       unsigned long long iteratedIndex = NEWESTINDEX(deDupList);
-       unsigned long long count = deDupList->entriesCount;
+       unsigned long long iteratedIndex;
+       unsigned long long count;
+
+       (void) pthread_mutex_lock(&deDupList->mutex);
+
+       iteratedIndex = NEWESTINDEX(deDupList);
+       count = deDupList->entriesCount;
 
 #ifdef PUD_DUMP_DEDUP
        olsr_printf(0, "isInDeDupList: count=%llu, iteratedIndex=%llu"
@@ -224,5 +251,7 @@ bool isInDeDupList(DeDupList * deDupList, union olsr_message *olsrMessage) {
        olsr_printf(0,"isInDeDupList: result = %s\n\n", retval ? "true" : "false");
 #endif
 
+       (void) pthread_mutex_unlock(&deDupList->mutex);
+
        return retval;
 }
index b37ede1..eda0b8d 100644 (file)
@@ -24,11 +24,13 @@ typedef struct _DeDupEntry {
  The list is a circular list.
  */
 typedef struct _DeDupList {
-               unsigned long long entriesMaxCount; /**< the maximum number of entries in the list */
-               DeDupEntry * entries; /**< the list entries */
+       pthread_mutex_t mutex; /**< access mutex */
 
-               unsigned long long entriesCount; /**< the number of entries in the list */
-               unsigned long long newestEntryIndex; /**< index of the newest entry in the list (zero-based) */
+       unsigned long long entriesMaxCount; /**< the maximum number of entries in the list */
+       DeDupEntry * entries; /**< the list entries */
+
+       unsigned long long entriesCount; /**< the number of entries in the list */
+       unsigned long long newestEntryIndex; /**< index of the newest entry in the list (zero-based) */
 } DeDupList;
 
 bool initDeDupList(DeDupList * deDupList, unsigned long long maxEntries);