X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/dff9e15c44ab6340d27215957c56fa72fad246a2..0a03cd809dd45e3645a54feffe364d8f2b33d71e:/src/xbt/dynar.c diff --git a/src/xbt/dynar.c b/src/xbt/dynar.c index 68be6978b7..906434b62c 100644 --- a/src/xbt/dynar.c +++ b/src/xbt/dynar.c @@ -15,9 +15,6 @@ #include "xbt/dynar.h" #include -#include "xbt/dynar_private.h" /* type definition, which we share with the - code in charge of sending this across the net */ - /* IMPLEMENTATION NOTE ON SYNCHRONIZATION: every functions which name is prefixed by _ * assumes that the dynar is already locked if we have to. * Other functions (public ones) check for this. @@ -92,7 +89,6 @@ static XBT_INLINE char *const old_data = (char *) dynar->data; const unsigned long elmsize = dynar->elmsize; - const unsigned long old_length = old_size * elmsize; const unsigned long used = dynar->used; const unsigned long used_length = used * elmsize; @@ -107,7 +103,6 @@ static XBT_INLINE if (old_data) { memcpy(new_data, old_data, used_length); - _xbt_clear_mem(old_data, old_length); free(old_data); } @@ -257,7 +252,7 @@ void xbt_dynar_free_container(xbt_dynar_t * dynar) * * \param dynar who to squeeze */ -void xbt_dynar_reset(xbt_dynar_t const dynar) +XBT_INLINE void xbt_dynar_reset(xbt_dynar_t const dynar) { _dynar_lock(dynar); @@ -316,7 +311,7 @@ void xbt_dynar_shrink(xbt_dynar_t dynar, int empty_slots_wanted) * kilkil a dynar and its content */ -void xbt_dynar_free(xbt_dynar_t * dynar) +XBT_INLINE void xbt_dynar_free(xbt_dynar_t * dynar) { if (dynar && *dynar) { xbt_dynar_reset(*dynar); @@ -334,7 +329,7 @@ void xbt_dynar_free_voidp(void *d) * * \param dynar the dynar we want to mesure */ -unsigned long xbt_dynar_length(const xbt_dynar_t dynar) +XBT_INLINE unsigned long xbt_dynar_length(const xbt_dynar_t dynar) { return (dynar ? (unsigned long) dynar->used : (unsigned long) 0); } @@ -345,7 +340,7 @@ unsigned long xbt_dynar_length(const xbt_dynar_t dynar) * \param idx index of the slot we want to retrieve * \param[out] dst where to put the result to. */ -void +XBT_INLINE void xbt_dynar_get_cpy(const xbt_dynar_t dynar, const unsigned long idx, void *const dst) { @@ -366,7 +361,7 @@ xbt_dynar_get_cpy(const xbt_dynar_t dynar, * \warning The returned value is the actual content of the dynar. * Make a copy before fooling with it. */ -void *xbt_dynar_get_ptr(const xbt_dynar_t dynar, const unsigned long idx) +XBT_INLINE void *xbt_dynar_get_ptr(const xbt_dynar_t dynar, const unsigned long idx) { void *res; @@ -405,7 +400,7 @@ _xbt_dynar_set(xbt_dynar_t dynar, * * If you want to free the previous content, use xbt_dynar_replace(). */ -void xbt_dynar_set(xbt_dynar_t dynar, const int idx, const void *const src) +XBT_INLINE void xbt_dynar_set(xbt_dynar_t dynar, const int idx, const void *const src) { _dynar_lock(dynar); @@ -490,7 +485,7 @@ void *xbt_dynar_insert_at_ptr(xbt_dynar_t const dynar, const int idx) * moving the previously existing value and all subsequent ones to one * position right in the dynar. */ -void +XBT_INLINE void xbt_dynar_insert_at(xbt_dynar_t const dynar, const int idx, const void *const src) { @@ -562,7 +557,7 @@ int xbt_dynar_member(xbt_dynar_t const dynar, void *const elem) * You can then use regular affectation to set its value instead of relying * on the slow memcpy. This is what xbt_dynar_push_as() does. */ -void *xbt_dynar_push_ptr(xbt_dynar_t const dynar) +XBT_INLINE void *xbt_dynar_push_ptr(xbt_dynar_t const dynar) { void *res; @@ -576,7 +571,7 @@ void *xbt_dynar_push_ptr(xbt_dynar_t const dynar) } /** @brief Add an element at the end of the dynar */ -void xbt_dynar_push(xbt_dynar_t const dynar, const void *const src) +XBT_INLINE void xbt_dynar_push(xbt_dynar_t const dynar, const void *const src) { _dynar_lock(dynar); /* checks done in xbt_dynar_insert_at_ptr */ @@ -589,7 +584,7 @@ void xbt_dynar_push(xbt_dynar_t const dynar, const void *const src) * You can then use regular affectation to set its value instead of relying * on the slow memcpy. This is what xbt_dynar_pop_as() does. */ -void *xbt_dynar_pop_ptr(xbt_dynar_t const dynar) +XBT_INLINE void *xbt_dynar_pop_ptr(xbt_dynar_t const dynar) { void *res; @@ -603,7 +598,7 @@ void *xbt_dynar_pop_ptr(xbt_dynar_t const dynar) } /** @brief Get and remove the last element of the dynar */ -void xbt_dynar_pop(xbt_dynar_t const dynar, void *const dst) +XBT_INLINE void xbt_dynar_pop(xbt_dynar_t const dynar, void *const dst) { /* sanity checks done by remove_at */ @@ -617,7 +612,7 @@ void xbt_dynar_pop(xbt_dynar_t const dynar, void *const dst) * * This is less efficient than xbt_dynar_push() */ -void xbt_dynar_unshift(xbt_dynar_t const dynar, const void *const src) +XBT_INLINE void xbt_dynar_unshift(xbt_dynar_t const dynar, const void *const src) { /* sanity checks done by insert_at */ @@ -628,7 +623,7 @@ void xbt_dynar_unshift(xbt_dynar_t const dynar, const void *const src) * * This is less efficient than xbt_dynar_pop() */ -void xbt_dynar_shift(xbt_dynar_t const dynar, void *const dst) +XBT_INLINE void xbt_dynar_shift(xbt_dynar_t const dynar, void *const dst) { /* sanity checks done by remove_at */ @@ -656,76 +651,23 @@ static void _dynar_map(const xbt_dynar_t dynar, void_f_pvoid_t const op) * operation, so make sure your function don't call any function * from xbt_dynar_* on it, or you'll get a deadlock. */ -void xbt_dynar_map(const xbt_dynar_t dynar, void_f_pvoid_t const op) +XBT_INLINE void xbt_dynar_map(const xbt_dynar_t dynar, void_f_pvoid_t const op) { - _dynar_lock(dynar); _sanity_check_dynar(dynar); + _dynar_lock(dynar); _dynar_map(dynar, op); _dynar_unlock(dynar); } -/** @brief Put the cursor at the begining of the dynar. - * - * Actually, the cursor is set one step before the begining, so that you - * can iterate over the dynar with a for loop. - * - * @warning Do not call this function directly, but only through xbt_dynar_foreach. - */ -void -_xbt_dynar_cursor_first(const xbt_dynar_t dynar, unsigned int *const cursor) -{ - - _dynar_lock(dynar); - DEBUG1("Set cursor on %p to the first position", (void *) dynar); - *cursor = 0; -} - -/** @brief Move the cursor to the next value - * - * @warning Do not call this function directly, but only through xbt_dynar_foreach. - */ -void -_xbt_dynar_cursor_step(const xbt_dynar_t dynar, unsigned int *const cursor) -{ - - (*cursor)++; -} - -/** @brief Get the data currently pointed by the cursor - * - * @warning Do not call this function directly, but only through xbt_dynar_foreach. - */ -int -_xbt_dynar_cursor_get(const xbt_dynar_t dynar, - unsigned int *const cursor, void *const dst) -{ - - _sanity_check_dynar(dynar); - { - - const unsigned long idx = *cursor; - - if (idx >= dynar->used) { - DEBUG1("Cursor on %p already on last elem", (void *) dynar); - _dynar_unlock(dynar); - return FALSE; - } - DEBUG2("Cash out cursor on %p at %lu", (void *) dynar, idx); - - _xbt_dynar_get_elm(dst, dynar, idx); - } - return TRUE; - -} /** @brief Removes and free the entry pointed by the cursor * * This function can be used while traversing without problem. */ -void xbt_dynar_cursor_rm(xbt_dynar_t dynar, unsigned int *const cursor) +XBT_INLINE void xbt_dynar_cursor_rm(xbt_dynar_t dynar, unsigned int *const cursor) { _xbt_dynar_remove_at(dynar, (*cursor)--, NULL); @@ -737,7 +679,7 @@ void xbt_dynar_cursor_rm(xbt_dynar_t dynar, unsigned int *const cursor) * xbt_dynar_foreach loop, but shouldn't be called at the end of a * regular traversal reaching the end of the elements */ -void xbt_dynar_cursor_unlock(xbt_dynar_t dynar) +XBT_INLINE void xbt_dynar_cursor_unlock(xbt_dynar_t dynar) { _dynar_unlock(dynar); } @@ -1196,8 +1138,7 @@ static void poper_f(void *a) } -XBT_TEST_UNIT("synchronized int", test_dynar_sync_int, - "Synchronized dynars of integers") +XBT_TEST_UNIT("synchronized int", test_dynar_sync_int,"Synchronized dynars of integers") { /* Vars_decl [doxygen cruft] */ xbt_dynar_t d; @@ -1205,8 +1146,8 @@ XBT_TEST_UNIT("synchronized int", test_dynar_sync_int, xbt_test_add0("==== Have a pusher and a popper on the dynar"); d = xbt_dynar_new_sync(sizeof(int), NULL); - pusher = xbt_thread_create("pusher", pusher_f, d); - poper = xbt_thread_create("poper", poper_f, d); + pusher = xbt_thread_create("pusher", pusher_f, d,0/*not joinable*/); + poper = xbt_thread_create("poper", poper_f, d,0/*not joinable*/); xbt_thread_join(pusher); xbt_thread_join(poper); xbt_dynar_free(&d);