From: Christian Grothoff Date: Sat, 3 Oct 2009 18:46:00 +0000 (+0000) Subject: use enum X-Git-Tag: initial-import-from-subversion-38251~23406 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=6aaab5e7cb4cb0c5fd5a5575c45b48124597e570;p=oweals%2Fgnunet.git use enum --- diff --git a/src/include/gnunet_container_lib.h b/src/include/gnunet_container_lib.h index b63ced75b..e27a58f13 100644 --- a/src/include/gnunet_container_lib.h +++ b/src/include/gnunet_container_lib.h @@ -42,10 +42,6 @@ extern "C" #endif -#define GNUNET_MEM_DISP_TRANSIENT 0 -#define GNUNET_MEM_DISP_STATIC 2 -#define GNUNET_MEM_DISP_DYNAMIC 4 - /* ******************* bloomfilter ***************** */ /** @@ -876,6 +872,30 @@ GNUNET_CONTAINER_heap_get_size (struct GNUNET_CONTAINER_Heap *heap); /* ******************** Singly linked list *************** */ +/** + * Possible ways for how data stored in the linked list + * might be allocated. + */ +enum GNUNET_CONTAINER_SListDisposition + { + /** + * Single-linked list must copy the buffer. + */ + GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT = 0, + + /** + * Data is static, no need to copy or free. + */ + GNUNET_CONTAINER_SLIST_DISPOSITION_STATIC = 2, + + /** + * Data is dynamic, do not copy but free when done. + */ + GNUNET_CONTAINER_SLIST_DISPOSITION_DYNAMIC = 4 + }; + + + /** * Handle to a singly linked list */ @@ -894,7 +914,9 @@ struct GNUNET_CONTAINER_SList_Iterator; * @param buf payload buffer * @param len length of the buffer */ -void GNUNET_CONTAINER_slist_add (struct GNUNET_CONTAINER_SList *l, int disp, const void *buf, size_t len); +void GNUNET_CONTAINER_slist_add (struct GNUNET_CONTAINER_SList *l, + enum GNUNET_CONTAINER_SListDisposition disp, + const void *buf, size_t len); /** @@ -960,7 +982,10 @@ void GNUNET_CONTAINER_slist_erase (struct GNUNET_CONTAINER_SList_Iterator *i); * @param buf payload buffer * @param len length of the payload */ -void GNUNET_CONTAINER_slist_insert (struct GNUNET_CONTAINER_SList_Iterator *before, int disp, const void *buf, size_t len); +void GNUNET_CONTAINER_slist_insert (struct GNUNET_CONTAINER_SList_Iterator *before, + enum GNUNET_CONTAINER_SListDisposition disp, + const void *buf, + size_t len); /** diff --git a/src/util/container_slist.c b/src/util/container_slist.c index 874068bdb..4d3c71a38 100644 --- a/src/util/container_slist.c +++ b/src/util/container_slist.c @@ -27,24 +27,68 @@ #include "platform.h" #include "gnunet_container_lib.h" +/** + * Element in our linked list. + */ struct GNUNET_CONTAINER_SList_Elem { + /** + * This is a linked list. + */ struct GNUNET_CONTAINER_SList_Elem *next; - const void *elem; + + /** + * Application data stored at this element. + */ + void *elem; + + /** + * Number of bytes stored in elem. + */ size_t len; - int disp; + + /** + * Disposition of the element. + */ + enum GNUNET_CONTAINER_SListDisposition disp; }; + +/** + * Handle to a singly linked list + */ struct GNUNET_CONTAINER_SList { + /** + * Head of the linked list. + */ struct GNUNET_CONTAINER_SList_Elem *head; + + /** + * Number of elements in the list. + */ unsigned int length; }; + +/** + * Handle to a singly linked list iterator + */ struct GNUNET_CONTAINER_SList_Iterator { + /** + * Linked list that we are iterating over. + */ struct GNUNET_CONTAINER_SList *list; + + /** + * Last element accessed. + */ struct GNUNET_CONTAINER_SList_Elem *last; + + /** + * Current list element. + */ struct GNUNET_CONTAINER_SList_Elem *elem; }; @@ -57,20 +101,22 @@ struct GNUNET_CONTAINER_SList_Iterator * @return a new element */ static struct GNUNET_CONTAINER_SList_Elem * -create_elem (int disp, const void *buf, size_t len) +create_elem (enum GNUNET_CONTAINER_SListDisposition disp, + const void *buf, + size_t len) { struct GNUNET_CONTAINER_SList_Elem *e; - if (disp == GNUNET_MEM_DISP_TRANSIENT) + if (disp == GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT) { e = GNUNET_malloc (sizeof (struct GNUNET_CONTAINER_SList_Elem) + len); memcpy (&e[1], buf, len); - e->elem = (const void*) &e[1]; + e->elem = (void*) &e[1]; } else { e = GNUNET_malloc (sizeof (struct GNUNET_CONTAINER_SList_Elem)); - e->elem = buf; + e->elem = (void*) buf; } e->disp = disp; e->len = len; @@ -86,7 +132,8 @@ create_elem (int disp, const void *buf, size_t len) * @param len length of the buffer */ void -GNUNET_CONTAINER_slist_add (struct GNUNET_CONTAINER_SList *l, int disp, +GNUNET_CONTAINER_slist_add (struct GNUNET_CONTAINER_SList *l, + enum GNUNET_CONTAINER_SListDisposition disp, const void *buf, size_t len) { struct GNUNET_CONTAINER_SList_Elem *e; @@ -108,6 +155,7 @@ GNUNET_CONTAINER_slist_create () return GNUNET_malloc (sizeof (struct GNUNET_CONTAINER_SList)); } + /** * Destroy a singly linked list * @param l the list to be destroyed @@ -151,6 +199,8 @@ GNUNET_CONTAINER_slist_clear (struct GNUNET_CONTAINER_SList *l) while (e != NULL) { n = e->next; + if (e->disp == GNUNET_CONTAINER_SLIST_DISPOSITION_DYNAMIC) + GNUNET_free (e->elem); GNUNET_free (e); e = n; } @@ -207,6 +257,8 @@ GNUNET_CONTAINER_slist_erase (struct GNUNET_CONTAINER_SList_Iterator *i) i->last->next = next; else i->list->head = next; + if (i->elem->disp == GNUNET_CONTAINER_SLIST_DISPOSITION_DYNAMIC) + GNUNET_free (i->elem->elem); GNUNET_free (i->elem); i->list->length--; i->elem = next; @@ -222,7 +274,8 @@ GNUNET_CONTAINER_slist_erase (struct GNUNET_CONTAINER_SList_Iterator *i) */ void GNUNET_CONTAINER_slist_insert (struct GNUNET_CONTAINER_SList_Iterator *before, - int disp, const void *buf, size_t len) + enum GNUNET_CONTAINER_SListDisposition disp, + const void *buf, size_t len) { struct GNUNET_CONTAINER_SList_Elem *e; diff --git a/src/util/network.c b/src/util/network.c index 43a9b65f2..031d7a1d7 100644 --- a/src/util/network.c +++ b/src/util/network.c @@ -496,7 +496,7 @@ GNUNET_NETWORK_fdset_copy (struct GNUNET_NETWORK_FDSet *to, size_t len; handle = GNUNET_CONTAINER_slist_get (iter, &len); - GNUNET_CONTAINER_slist_add (to->handles, GNUNET_MEM_DISP_TRANSIENT, handle, len); + GNUNET_CONTAINER_slist_add (to->handles, GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT, handle, len); } #endif } diff --git a/src/util/test_container_slist.c b/src/util/test_container_slist.c index 9d75f1695..0c4525c45 100644 --- a/src/util/test_container_slist.c +++ b/src/util/test_container_slist.c @@ -46,7 +46,7 @@ main (int argc, char *argv[]) CHECK (GNUNET_CONTAINER_slist_count (l) == 0); for (i = 0; i < 100; i++) - GNUNET_CONTAINER_slist_add (l, GNUNET_MEM_DISP_TRANSIENT, &i, sizeof (i)); + GNUNET_CONTAINER_slist_add (l, GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT, &i, sizeof (i)); CHECK (GNUNET_CONTAINER_slist_count (l) == 100); for (it = GNUNET_CONTAINER_slist_begin (l), i = 99; @@ -60,7 +60,7 @@ main (int argc, char *argv[]) CHECK (s == sizeof (i)); j *= 2; - GNUNET_CONTAINER_slist_insert (it, GNUNET_MEM_DISP_TRANSIENT, &j, + GNUNET_CONTAINER_slist_insert (it, GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT, &j, sizeof (j)); } GNUNET_free (it); @@ -99,7 +99,7 @@ main (int argc, char *argv[]) CHECK (GNUNET_CONTAINER_slist_count (l) == 0); for (i = 0; i < 100; i++) - GNUNET_CONTAINER_slist_add (l, GNUNET_MEM_DISP_TRANSIENT, &i, sizeof (i)); + GNUNET_CONTAINER_slist_add (l, GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT, &i, sizeof (i)); GNUNET_CONTAINER_slist_destroy (l);