X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3a9be3b03e764af6a69418124a4e213713b2fd6d..3203ed1f4fb6f4617e94d5351661ba07e8b8f833:/src/xbt/fifo.c diff --git a/src/xbt/fifo.c b/src/xbt/fifo.c index 7db645ea05..6647ae958d 100644 --- a/src/xbt/fifo.c +++ b/src/xbt/fifo.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010. The SimGrid Team. +/* Copyright (c) 2004-2014. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -8,12 +8,12 @@ #include "xbt/log.h" #include "xbt/mallocator.h" #include "fifo_private.h" -#include "xbt_modinter.h" +#include "src/xbt_modinter.h" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_fifo, xbt, "FIFO"); static void *fifo_item_mallocator_new_f(void); -static void fifo_item_mallocator_free_f(void *item); +#define fifo_item_mallocator_free_f xbt_free_f static void fifo_item_mallocator_reset_f(void *item); static xbt_mallocator_t item_mallocator = NULL; @@ -331,6 +331,42 @@ int xbt_fifo_is_in(xbt_fifo_t f, void *content) return 0; } +/** + * @brief Search the given element in the fifo using a comparison function + * + * This function allows to search an item with a user provided function instead + * of the pointer comparison used elsewhere in this module. Assume for example that you have a fifo of + * strings. You cannot use xbt_fifo_remove() to remove, say, "TOTO" from it because internally, xbt_fifo_remove() + * will do something like "if (item->content == "toto"), then remove it". And the pointer to the item content + * and the pointer to "toto" will never match. As a solution, the current function provides a way to search elements + * that are semanticaly equivalent instead of only syntaxically. So, removing "Toto" from a fifo can be + * achieved this way: + * + * @verbatim +int my_comparison_function(void *searched, void *seen) { + return !strcmp(searched, seen); +} + + xbt_fifo_remove_item(fifo, + xbt_fifo_search_item(fifo, my_comparison_function, "Toto")); +@endverbatim + * + * \param f a fifo list + * \param cmp_fun the comparison function. Prototype: void *a,void *b -> int. Semantic: returns true iff a=b + * @param closure the element to search. It will be provided as first argument to each call of cmp_fun + * \return the first item matching the comparison function, or NULL if no such item exists + */ +xbt_fifo_item_t xbt_fifo_search_item(xbt_fifo_t f, int_f_pvoid_pvoid_t cmp_fun, void *closure) { + xbt_fifo_item_t item = xbt_fifo_get_first_item(f); + while (item) { + if (cmp_fun(closure, item->content)) + return item; + item = item->next; + } + return NULL; + +} + /** * \param f a list * \return a table with the objects stored in \a f. @@ -375,11 +411,6 @@ static void *fifo_item_mallocator_new_f(void) return xbt_new(s_xbt_fifo_item_t, 1); } -static void fifo_item_mallocator_free_f(void *item) -{ - xbt_free(item); -} - static void fifo_item_mallocator_reset_f(void *item) { /* memset to zero like calloc */ @@ -389,7 +420,7 @@ static void fifo_item_mallocator_reset_f(void *item) /** Constructor * \return a new bucket */ -xbt_fifo_item_t xbt_fifo_new_item(void) +XBT_INLINE xbt_fifo_item_t xbt_fifo_new_item(void) { return xbt_mallocator_get(item_mallocator); } @@ -398,7 +429,7 @@ xbt_fifo_item_t xbt_fifo_new_item(void) */ XBT_INLINE xbt_fifo_item_t xbt_fifo_newitem(void) { - XBT_WARN("This function is deprecated. Use xbt_fifo_new_item."); + XBT_CWARN(xbt_fifo, "This function is deprecated. Use xbt_fifo_new_item."); return xbt_fifo_new_item(); } @@ -427,7 +458,7 @@ XBT_INLINE void *xbt_fifo_get_item_content(xbt_fifo_item_t i) * * Free the bucket but does not modifies the object (if any) that was stored in it. */ -void xbt_fifo_free_item(xbt_fifo_item_t b) +XBT_INLINE void xbt_fifo_free_item(xbt_fifo_item_t b) { xbt_mallocator_release(item_mallocator, b); return; @@ -438,7 +469,7 @@ void xbt_fifo_free_item(xbt_fifo_item_t b) */ XBT_INLINE void xbt_fifo_freeitem(xbt_fifo_item_t b) { - XBT_WARN("This function is deprecated. Use xbt_fifo_free_item."); + XBT_CWARN(xbt_fifo, "This function is deprecated. Use xbt_fifo_free_item."); xbt_fifo_free_item(b); return; } @@ -455,8 +486,10 @@ XBT_INLINE int xbt_fifo_size(xbt_fifo_t f) /** * \param l a list * \return the head of \a l. + * + * Returns NULL if the list is empty. */ -xbt_fifo_item_t xbt_fifo_get_first_item(xbt_fifo_t l) +XBT_INLINE xbt_fifo_item_t xbt_fifo_get_first_item(xbt_fifo_t l) { return l->head; } @@ -464,8 +497,10 @@ xbt_fifo_item_t xbt_fifo_get_first_item(xbt_fifo_t l) /** * \param l a list * \return the tail of \a l. + * + * Returns NULL if the list is empty. */ -xbt_fifo_item_t xbt_fifo_get_last_item(xbt_fifo_t l) +XBT_INLINE xbt_fifo_item_t xbt_fifo_get_last_item(xbt_fifo_t l) { return l->tail; } @@ -474,13 +509,15 @@ xbt_fifo_item_t xbt_fifo_get_last_item(xbt_fifo_t l) */ XBT_INLINE xbt_fifo_item_t xbt_fifo_getFirstItem(xbt_fifo_t l) { - XBT_WARN("This function is deprecated. Use xbt_fifo_get_first_item."); + XBT_CWARN(xbt_fifo, "This function is deprecated. Use xbt_fifo_get_first_item."); return xbt_fifo_get_first_item(l); } /** * \param i a bucket * \return the bucket that comes next + * + * Returns NULL if \a i is the tail of the list. */ XBT_INLINE xbt_fifo_item_t xbt_fifo_get_next_item(xbt_fifo_item_t i) { @@ -493,13 +530,15 @@ XBT_INLINE xbt_fifo_item_t xbt_fifo_get_next_item(xbt_fifo_item_t i) */ xbt_fifo_item_t xbt_fifo_getNextItem(xbt_fifo_item_t i) { - XBT_WARN("This function is deprecated. Use xbt_fifo_get_next_item."); + XBT_CWARN(xbt_fifo, "This function is deprecated. Use xbt_fifo_get_next_item."); return xbt_fifo_get_next_item(i); } /** * \param i a bucket * \return the bucket that is just before \a i. + * + * Returns NULL if \a i is the head of the list. */ XBT_INLINE xbt_fifo_item_t xbt_fifo_get_prev_item(xbt_fifo_item_t i) { @@ -522,11 +561,6 @@ xbt_fifo_item_t xbt_fifo_getPrevItem(xbt_fifo_item_t i) */ void xbt_fifo_preinit(void) { - if (item_mallocator != NULL) { - /* Already created. I guess we want to switch to MC mode, so kill the previously created mallocator */ - xbt_mallocator_free(item_mallocator); - } - item_mallocator = xbt_mallocator_new(65536, fifo_item_mallocator_new_f, fifo_item_mallocator_free_f,