X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/dff9e15c44ab6340d27215957c56fa72fad246a2..aa29c3a2434a29e6901f1e98aa0c171ee15d73cc:/src/xbt/fifo.c diff --git a/src/xbt/fifo.c b/src/xbt/fifo.c index de76e6416d..a11b4168bb 100644 --- a/src/xbt/fifo.c +++ b/src/xbt/fifo.c @@ -1,6 +1,5 @@ -/* $Id$ */ - -/* Copyright (c) 2004 Arnaud Legrand. All rights reserved. */ +/* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010. The SimGrid Team. + * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -27,15 +26,10 @@ xbt_fifo_t xbt_fifo_new(void) xbt_fifo_t fifo; fifo = xbt_new0(struct xbt_fifo, 1); - if (item_mallocator == NULL) { - item_mallocator = xbt_mallocator_new(256, - fifo_item_mallocator_new_f, - fifo_item_mallocator_free_f, - fifo_item_mallocator_reset_f); - } return fifo; } + /** Destructor * \param l poor victim * @@ -384,14 +378,14 @@ 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); } /** \deprecated Use #xbt_fifo_new_item instead. */ -xbt_fifo_item_t xbt_fifo_newitem(void) +XBT_INLINE xbt_fifo_item_t xbt_fifo_newitem(void) { WARN0("This function is deprecated. Use xbt_fifo_new_item."); return xbt_fifo_new_item(); @@ -403,7 +397,7 @@ xbt_fifo_item_t xbt_fifo_newitem(void) * * stores \a v in \a i. */ -void xbt_fifo_set_item_content(xbt_fifo_item_t i, void *v) +XBT_INLINE void xbt_fifo_set_item_content(xbt_fifo_item_t i, void *v) { xbt_fifo_setItemcontent(i, v); } @@ -412,7 +406,7 @@ void xbt_fifo_set_item_content(xbt_fifo_item_t i, void *v) * \param i a bucket * \return the object stored \a i. */ -void *xbt_fifo_get_item_content(xbt_fifo_item_t i) +XBT_INLINE void *xbt_fifo_get_item_content(xbt_fifo_item_t i) { return xbt_fifo_getItemcontent(i); } @@ -422,7 +416,7 @@ 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; @@ -431,7 +425,7 @@ void xbt_fifo_free_item(xbt_fifo_item_t b) /** Destructor * \deprecated Use #xbt_fifo_free_item instead. */ -void xbt_fifo_freeitem(xbt_fifo_item_t b) +XBT_INLINE void xbt_fifo_freeitem(xbt_fifo_item_t b) { WARN0("This function is deprecated. Use xbt_fifo_free_item."); xbt_fifo_free_item(b); @@ -442,7 +436,7 @@ void xbt_fifo_freeitem(xbt_fifo_item_t b) * \param f a list * \return the number of buckets in \a f. */ -int xbt_fifo_size(xbt_fifo_t f) +XBT_INLINE int xbt_fifo_size(xbt_fifo_t f) { return f->count; } @@ -451,14 +445,23 @@ int xbt_fifo_size(xbt_fifo_t f) * \param l a list * \return the head of \a l. */ -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; } +/** + * \param l a list + * \return the tail of \a l. + */ +XBT_INLINE xbt_fifo_item_t xbt_fifo_get_last_item(xbt_fifo_t l) +{ + return l->tail; +} + /** \deprecated Use #xbt_fifo_get_first_item instead. */ -xbt_fifo_item_t xbt_fifo_getFirstItem(xbt_fifo_t l) +XBT_INLINE xbt_fifo_item_t xbt_fifo_getFirstItem(xbt_fifo_t l) { WARN0("This function is deprecated. Use xbt_fifo_get_first_item."); return xbt_fifo_get_first_item(l); @@ -468,7 +471,7 @@ xbt_fifo_item_t xbt_fifo_getFirstItem(xbt_fifo_t l) * \param i a bucket * \return the bucket that comes next */ -xbt_fifo_item_t xbt_fifo_get_next_item(xbt_fifo_item_t i) +XBT_INLINE xbt_fifo_item_t xbt_fifo_get_next_item(xbt_fifo_item_t i) { if (i) return i->next; @@ -487,7 +490,7 @@ xbt_fifo_item_t xbt_fifo_getNextItem(xbt_fifo_item_t i) * \param i a bucket * \return the bucket that is just before \a i. */ -xbt_fifo_item_t xbt_fifo_get_prev_item(xbt_fifo_item_t i) +XBT_INLINE xbt_fifo_item_t xbt_fifo_get_prev_item(xbt_fifo_item_t i) { if (i) return i->prev; @@ -502,12 +505,23 @@ xbt_fifo_item_t xbt_fifo_getPrevItem(xbt_fifo_item_t i) return xbt_fifo_get_prev_item(i); } -/** - * Destroy the fifo item mallocator. - * This is an internal XBT function called by xbt_exit(). +/* Module init/exit handling the fifo item mallocator + * These are internal XBT functions called by xbt_preinit/postexit(). + * It can be used several times to recreate the mallocator, for example when you switch to MC mode */ -void xbt_fifo_exit(void) -{ +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(256, + fifo_item_mallocator_new_f, + fifo_item_mallocator_free_f, + fifo_item_mallocator_reset_f); +} + +void xbt_fifo_postexit(void) { if (item_mallocator != NULL) { xbt_mallocator_free(item_mallocator); item_mallocator = NULL;