From 662b5736c37e8cf2b3e6aa5af53cef0d03b743ab Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Fri, 14 Oct 2011 07:22:42 +0000 Subject: [PATCH] LRN loves slist: Use stack allocation for slist iterator --- src/include/gnunet_container_lib.h | 25 ++++++++++-- src/util/container_slist.c | 44 ++++++--------------- src/util/network.c | 63 +++++++++++++----------------- src/util/test_container_slist.c | 42 +++++++++----------- 4 files changed, 80 insertions(+), 94 deletions(-) diff --git a/src/include/gnunet_container_lib.h b/src/include/gnunet_container_lib.h index 0c7f60a7a..75443b6ae 100644 --- a/src/include/gnunet_container_lib.h +++ b/src/include/gnunet_container_lib.h @@ -1054,7 +1054,24 @@ struct GNUNET_CONTAINER_SList; /** * Handle to a singly linked list iterator */ -struct GNUNET_CONTAINER_SList_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; +}; + /** @@ -1113,9 +1130,11 @@ GNUNET_CONTAINER_slist_destroy (struct GNUNET_CONTAINER_SList *l); * Return the beginning of a list * * @param l list - * @return iterator pointing to the beginning, free using "GNUNET_free" + * @return iterator pointing to the beginning (by value! Either allocate the + * structure on the stack, or use GNUNET_malloc() yourself! All other + * functions do take pointer to this struct though) */ -struct GNUNET_CONTAINER_SList_Iterator * +struct GNUNET_CONTAINER_SList_Iterator GNUNET_CONTAINER_slist_begin (struct GNUNET_CONTAINER_SList *l); diff --git a/src/util/container_slist.c b/src/util/container_slist.c index 144d352ce..2704713d4 100644 --- a/src/util/container_slist.c +++ b/src/util/container_slist.c @@ -78,27 +78,6 @@ struct GNUNET_CONTAINER_SList }; -/** - * 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; -}; - /** * Create a new element that is to be inserted into the list @@ -186,22 +165,22 @@ void GNUNET_CONTAINER_slist_append (struct GNUNET_CONTAINER_SList *dst, struct GNUNET_CONTAINER_SList *src) { - struct GNUNET_CONTAINER_SList_Iterator *i; + struct GNUNET_CONTAINER_SList_Iterator i; for (i = GNUNET_CONTAINER_slist_begin (src); - GNUNET_CONTAINER_slist_end (i) != GNUNET_YES; - GNUNET_CONTAINER_slist_next (i)) + GNUNET_CONTAINER_slist_end (&i) != GNUNET_YES; + GNUNET_CONTAINER_slist_next (&i)) { GNUNET_CONTAINER_slist_add (dst, - (i->elem->disp == + (i.elem->disp == GNUNET_CONTAINER_SLIST_DISPOSITION_STATIC) ? GNUNET_CONTAINER_SLIST_DISPOSITION_STATIC : GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT, - i->elem->elem, i->elem->len); + i.elem->elem, i.elem->len); } - GNUNET_CONTAINER_slist_iter_destroy (i); + GNUNET_CONTAINER_slist_iter_destroy (&i); } @@ -233,14 +212,14 @@ GNUNET_CONTAINER_slist_destroy (struct GNUNET_CONTAINER_SList *l) * @param l list * @return iterator pointing to the beginning */ -struct GNUNET_CONTAINER_SList_Iterator * +struct GNUNET_CONTAINER_SList_Iterator GNUNET_CONTAINER_slist_begin (struct GNUNET_CONTAINER_SList *l) { - struct GNUNET_CONTAINER_SList_Iterator *ret; + struct GNUNET_CONTAINER_SList_Iterator ret; - ret = GNUNET_malloc (sizeof (struct GNUNET_CONTAINER_SList_Iterator)); - ret->elem = l->head; - ret->list = l; + memset (&ret, 0, sizeof (ret)); + ret.elem = l->head; + ret.list = l; return ret; } @@ -405,7 +384,6 @@ void GNUNET_CONTAINER_slist_iter_destroy (struct GNUNET_CONTAINER_SList_Iterator *i) { - GNUNET_free (i); } /* end of container_slist.c */ diff --git a/src/util/network.c b/src/util/network.c index fa097dff4..3085d271f 100644 --- a/src/util/network.c +++ b/src/util/network.c @@ -1010,7 +1010,7 @@ GNUNET_NETWORK_fdset_overlap (const struct GNUNET_NETWORK_FDSet *fds1, return GNUNET_YES; } #else - struct GNUNET_CONTAINER_SList_Iterator *it; + struct GNUNET_CONTAINER_SList_Iterator it; struct GNUNET_DISK_FileHandle *h; int i; int j; @@ -1027,25 +1027,25 @@ GNUNET_NETWORK_fdset_overlap (const struct GNUNET_NETWORK_FDSet *fds1, } } it = GNUNET_CONTAINER_slist_begin (fds1->handles); - while (GNUNET_CONTAINER_slist_end (it) != GNUNET_YES) + while (GNUNET_CONTAINER_slist_end (&it) != GNUNET_YES) { #if DEBUG_NETWORK - struct GNUNET_CONTAINER_SList_Iterator *t; + struct GNUNET_CONTAINER_SList_Iterator t; #endif h = - (struct GNUNET_DISK_FileHandle *) GNUNET_CONTAINER_slist_get (it, + (struct GNUNET_DISK_FileHandle *) GNUNET_CONTAINER_slist_get (&it, NULL); #if DEBUG_NETWORK LOG (GNUNET_ERROR_TYPE_DEBUG, "Checking that FD 0x%x is in another set:\n", h->h); for (t = GNUNET_CONTAINER_slist_begin (fds2->handles); - GNUNET_CONTAINER_slist_end (t) != GNUNET_YES; - GNUNET_CONTAINER_slist_next (t)) + GNUNET_CONTAINER_slist_end (&t) != GNUNET_YES; + GNUNET_CONTAINER_slist_next (&t)) { struct GNUNET_DISK_FileHandle *fh; fh = - (struct GNUNET_DISK_FileHandle *) GNUNET_CONTAINER_slist_get (t, + (struct GNUNET_DISK_FileHandle *) GNUNET_CONTAINER_slist_get (&t, NULL); LOG (GNUNET_ERROR_TYPE_DEBUG, "0x%x\n", fh->h); } @@ -1056,12 +1056,10 @@ GNUNET_NETWORK_fdset_overlap (const struct GNUNET_NETWORK_FDSet *fds1, #if DEBUG_NETWORK LOG (GNUNET_ERROR_TYPE_DEBUG, "Match!\n"); #endif - GNUNET_CONTAINER_slist_iter_destroy (it); return GNUNET_YES; } - GNUNET_CONTAINER_slist_next (it); + GNUNET_CONTAINER_slist_next (&it); } - GNUNET_CONTAINER_slist_iter_destroy (it); #endif return GNUNET_NO; } @@ -1161,21 +1159,20 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, handles += read_handles = GNUNET_CONTAINER_slist_count (rfds->handles); #if DEBUG_NETWORK { - struct GNUNET_CONTAINER_SList_Iterator *t; + struct GNUNET_CONTAINER_SList_Iterator t; for (t = GNUNET_CONTAINER_slist_begin (rfds->handles); - GNUNET_CONTAINER_slist_end (t) != GNUNET_YES; - GNUNET_CONTAINER_slist_next (t)) + GNUNET_CONTAINER_slist_end (&t) != GNUNET_YES; + GNUNET_CONTAINER_slist_next (&t)) { struct GNUNET_DISK_FileHandle *fh; fh = - (struct GNUNET_DISK_FileHandle *) GNUNET_CONTAINER_slist_get (t, + (struct GNUNET_DISK_FileHandle *) GNUNET_CONTAINER_slist_get (&t, NULL); LOG (GNUNET_ERROR_TYPE_DEBUG, "FD 0x%x (0x%x) is SET in rfds\n", fh->h, fh); } - GNUNET_CONTAINER_slist_iter_destroy (t); } #endif #endif @@ -1291,16 +1288,16 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, /* Read Pipes */ if (rfds && read_handles) { - struct GNUNET_CONTAINER_SList_Iterator *i; + struct GNUNET_CONTAINER_SList_Iterator i; for (i = GNUNET_CONTAINER_slist_begin (rfds->handles); - GNUNET_CONTAINER_slist_end (i) != GNUNET_YES; - GNUNET_CONTAINER_slist_next (i)) + GNUNET_CONTAINER_slist_end (&i) != GNUNET_YES; + GNUNET_CONTAINER_slist_next (&i)) { struct GNUNET_DISK_FileHandle *fh; fh = - (struct GNUNET_DISK_FileHandle *) GNUNET_CONTAINER_slist_get (i, + (struct GNUNET_DISK_FileHandle *) GNUNET_CONTAINER_slist_get (&i, NULL); if (fh->type == GNUNET_PIPE) { @@ -1350,7 +1347,6 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, GNUNET_DISK_FileHandle)); } } - GNUNET_CONTAINER_slist_iter_destroy (i); } if (wfds && write_handles) { @@ -1363,17 +1359,17 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, } if (efds && ex_handles) { - struct GNUNET_CONTAINER_SList_Iterator *i; + struct GNUNET_CONTAINER_SList_Iterator i; for (i = GNUNET_CONTAINER_slist_begin (efds->handles); - GNUNET_CONTAINER_slist_end (i) != GNUNET_YES; - GNUNET_CONTAINER_slist_next (i)) + GNUNET_CONTAINER_slist_end (&i) != GNUNET_YES; + GNUNET_CONTAINER_slist_next (&i)) { struct GNUNET_DISK_FileHandle *fh; DWORD dwBytes; fh = - (struct GNUNET_DISK_FileHandle *) GNUNET_CONTAINER_slist_get (i, + (struct GNUNET_DISK_FileHandle *) GNUNET_CONTAINER_slist_get (&i, NULL); if (fh->type == GNUNET_PIPE) { @@ -1388,7 +1384,6 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, } } } - GNUNET_CONTAINER_slist_iter_destroy (i); } if (nfds > 0) { @@ -1610,7 +1605,7 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, #endif if (rfds) { - struct GNUNET_CONTAINER_SList_Iterator *t; + struct GNUNET_CONTAINER_SList_Iterator t; for (i = 0; i < rfds->sds.fd_count; i++) { @@ -1618,20 +1613,19 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, nsock++; } for (t = GNUNET_CONTAINER_slist_begin (rfds->handles); - GNUNET_CONTAINER_slist_end (t) != GNUNET_YES; - GNUNET_CONTAINER_slist_next (t)) + GNUNET_CONTAINER_slist_end (&t) != GNUNET_YES; + GNUNET_CONTAINER_slist_next (&t)) { struct GNUNET_DISK_FileHandle *fh; fh = - (struct GNUNET_DISK_FileHandle *) GNUNET_CONTAINER_slist_get (t, + (struct GNUNET_DISK_FileHandle *) GNUNET_CONTAINER_slist_get (&t, NULL); if (fh->type == GNUNET_PIPE) { CancelIo (fh->h); } } - GNUNET_CONTAINER_slist_iter_destroy (t); #if DEBUG_NETWORK LOG (GNUNET_ERROR_TYPE_DEBUG, "Zeroing rfds\n"); #endif @@ -1676,7 +1670,7 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, #if DEBUG_NETWORK if (rfds) { - struct GNUNET_CONTAINER_SList_Iterator *t; + struct GNUNET_CONTAINER_SList_Iterator t; for (i = 0; i < bread.fd_count; i++) { @@ -1687,17 +1681,16 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, "NOT SET"); } for (t = GNUNET_CONTAINER_slist_begin (rfds->handles); - GNUNET_CONTAINER_slist_end (t) != GNUNET_YES; - GNUNET_CONTAINER_slist_next (t)) + GNUNET_CONTAINER_slist_end (&t) != GNUNET_YES; + GNUNET_CONTAINER_slist_next (&t)) { struct GNUNET_DISK_FileHandle *fh; fh = - (struct GNUNET_DISK_FileHandle *) GNUNET_CONTAINER_slist_get (t, + (struct GNUNET_DISK_FileHandle *) GNUNET_CONTAINER_slist_get (&t, NULL); LOG (GNUNET_ERROR_TYPE_DEBUG, "FD 0x%x is SET in rfds\n", fh->h); } - GNUNET_CONTAINER_slist_iter_destroy (t); } if (wfds) { diff --git a/src/util/test_container_slist.c b/src/util/test_container_slist.c index 307a6b248..394dc4cdb 100644 --- a/src/util/test_container_slist.c +++ b/src/util/test_container_slist.c @@ -32,7 +32,7 @@ int main (int argc, char *argv[]) { struct GNUNET_CONTAINER_SList *l; - struct GNUNET_CONTAINER_SList_Iterator *it; + struct GNUNET_CONTAINER_SList_Iterator it; unsigned int i; int *ip; unsigned int j; @@ -52,47 +52,45 @@ main (int argc, char *argv[]) GNUNET_assert (GNUNET_CONTAINER_slist_count (l) == 100); for (it = GNUNET_CONTAINER_slist_begin (l), i = 99; - GNUNET_CONTAINER_slist_end (it) != GNUNET_YES; - GNUNET_CONTAINER_slist_next (it), i--) + GNUNET_CONTAINER_slist_end (&it) != GNUNET_YES; + GNUNET_CONTAINER_slist_next (&it), i--) { - p = GNUNET_CONTAINER_slist_get (it, &s); + p = GNUNET_CONTAINER_slist_get (&it, &s); if ((p == NULL) || (i != (j = *(int *) p)) || (s != sizeof (i))) { - GNUNET_CONTAINER_slist_iter_destroy (it); + GNUNET_CONTAINER_slist_iter_destroy (&it); GNUNET_assert (0); } j *= 2; - GNUNET_CONTAINER_slist_insert (it, + GNUNET_CONTAINER_slist_insert (&it, GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT, &j, sizeof (j)); } - GNUNET_CONTAINER_slist_iter_destroy (it); GNUNET_assert (GNUNET_CONTAINER_slist_count (l) == 200); i = 198; GNUNET_assert (GNUNET_CONTAINER_slist_contains (l, &i, sizeof (i))); for (it = GNUNET_CONTAINER_slist_begin (l); - GNUNET_CONTAINER_slist_end (it) != GNUNET_YES;) + GNUNET_CONTAINER_slist_end (&it) != GNUNET_YES;) { - p = GNUNET_CONTAINER_slist_get (it, &s); + p = GNUNET_CONTAINER_slist_get (&it, &s); GNUNET_assert (p != NULL); GNUNET_assert (s == sizeof (i)); i = *(int *) p; - GNUNET_assert (GNUNET_CONTAINER_slist_next (it) == GNUNET_YES); - GNUNET_assert (GNUNET_CONTAINER_slist_end (it) != GNUNET_YES); + GNUNET_assert (GNUNET_CONTAINER_slist_next (&it) == GNUNET_YES); + GNUNET_assert (GNUNET_CONTAINER_slist_end (&it) != GNUNET_YES); - p = GNUNET_CONTAINER_slist_get (it, &s); + p = GNUNET_CONTAINER_slist_get (&it, &s); GNUNET_assert (p != NULL); GNUNET_assert (s == sizeof (j)); j = *(int *) p; GNUNET_assert (j * 2 == i); - GNUNET_CONTAINER_slist_erase (it); + GNUNET_CONTAINER_slist_erase (&it); } - GNUNET_CONTAINER_slist_iter_destroy (it); GNUNET_assert (GNUNET_CONTAINER_slist_count (l) == 100); i = 99; GNUNET_assert (GNUNET_CONTAINER_slist_contains (l, &i, sizeof (i)) == @@ -124,18 +122,16 @@ main (int argc, char *argv[]) GNUNET_assert (GNUNET_CONTAINER_slist_count (l) == 100); for (it = GNUNET_CONTAINER_slist_begin (l), i = 0; - GNUNET_CONTAINER_slist_end (it) != GNUNET_YES; - GNUNET_CONTAINER_slist_next (it), i++) + GNUNET_CONTAINER_slist_end (&it) != GNUNET_YES; + GNUNET_CONTAINER_slist_next (&it), i++) { - p = GNUNET_CONTAINER_slist_get (it, &s); + p = GNUNET_CONTAINER_slist_get (&it, &s); if ((p == NULL) || (i != *(int *) p) || (s != sizeof (i))) { - GNUNET_CONTAINER_slist_iter_destroy (it); GNUNET_assert (0); } } - GNUNET_CONTAINER_slist_iter_destroy (it); GNUNET_CONTAINER_slist_destroy (l); /*check if disp = GNUNET_CONTAINER_SLIST_DISPOSITION_DYNAMIC */ @@ -151,12 +147,12 @@ main (int argc, char *argv[]) } //creat_add it = GNUNET_CONTAINER_slist_begin (l); - p = GNUNET_CONTAINER_slist_get (it, &s); + p = GNUNET_CONTAINER_slist_get (&it, &s); GNUNET_assert (p != NULL); //slist_erase - GNUNET_assert (GNUNET_CONTAINER_slist_next (it) == GNUNET_YES); - GNUNET_CONTAINER_slist_erase (it); - GNUNET_CONTAINER_slist_iter_destroy (it); + GNUNET_assert (GNUNET_CONTAINER_slist_next (&it) == GNUNET_YES); + GNUNET_CONTAINER_slist_erase (&it); + GNUNET_CONTAINER_slist_iter_destroy (&it); GNUNET_assert (GNUNET_CONTAINER_slist_count (l) == 99); //slist_clear GNUNET_CONTAINER_slist_clear (l); -- 2.25.1