X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7c5d24856794b213573f5e67bf138db144dac2eb..b9e946cdde00d87529a22bd6e152357d8e71e935:/src/xbt/dynar.c diff --git a/src/xbt/dynar.c b/src/xbt/dynar.c index d55871017f..f29b2806c8 100644 --- a/src/xbt/dynar.c +++ b/src/xbt/dynar.c @@ -27,10 +27,10 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_dyn,xbt,"Dynamic arrays"); #define _dynar_lock(dynar) \ if (dynar->mutex) \ - xbt_mutex_lock(dynar->mutex) + xbt_mutex_acquire(dynar->mutex) #define _dynar_unlock(dynar) \ if (dynar->mutex) \ - xbt_mutex_unlock(dynar->mutex) + xbt_mutex_release(dynar->mutex) #define _sanity_check_dynar(dynar) \ xbt_assert0(dynar, \ "dynar is NULL") @@ -81,7 +81,7 @@ _xbt_dynar_expand(xbt_dynar_t const dynar, const unsigned long new_length = new_size*elmsize; char * const new_data = (char *) xbt_malloc0(elmsize*new_size); - DEBUG3("expend %p from %lu to %d elements", (void*)dynar, (unsigned long)old_size, nb); + DEBUG3("expend %p from %lu to %lu elements", (void*)dynar, (unsigned long)old_size, nb); if (old_data) { memcpy(new_data, old_data, used_length); @@ -503,7 +503,7 @@ xbt_dynar_remove_at(xbt_dynar_t const dynar, void * const object) { _dynar_lock(dynar); - _xbt_dynar_remove_at(dynar, idx, object); + _xbt_dynar_remove_at(dynar, idx, object); _dynar_unlock(dynar); } @@ -553,15 +553,27 @@ xbt_dynar_member(xbt_dynar_t const dynar, */ void * xbt_dynar_push_ptr(xbt_dynar_t const dynar) { - return xbt_dynar_insert_at_ptr(dynar, dynar->used); + void *res; + + /* we have to inline xbt_dynar_insert_at_ptr here to make sure that + dynar->used don't change between reading it and getting the lock + within xbt_dynar_insert_at_ptr */ + _dynar_lock(dynar); + res = _xbt_dynar_insert_at_ptr(dynar,dynar->used); + _dynar_unlock(dynar); + return res; } /** @brief Add an element at the end of the dynar */ void xbt_dynar_push(xbt_dynar_t const dynar, const void * const src) { - /* sanity checks done by insert_at */ - xbt_dynar_insert_at(dynar, dynar->used, src); + _dynar_lock(dynar); + /* checks done in xbt_dynar_insert_at_ptr */ + memcpy(_xbt_dynar_insert_at_ptr(dynar,dynar->used), + src, + dynar->elmsize); + _dynar_unlock(dynar); } /** @brief Mark the last dynar's element as unused and return a pointer to it. @@ -589,7 +601,9 @@ xbt_dynar_pop(xbt_dynar_t const dynar, /* sanity checks done by remove_at */ DEBUG1("Pop %p",(void*)dynar); - xbt_dynar_remove_at(dynar, dynar->used-1, dst); + _dynar_lock(dynar); + _xbt_dynar_remove_at(dynar, dynar->used-1, dst); + _dynar_unlock(dynar); } /** @brief Add an element at the begining of the dynar. @@ -658,7 +672,7 @@ xbt_dynar_map(const xbt_dynar_t dynar, */ void _xbt_dynar_cursor_first(const xbt_dynar_t dynar, - int * const cursor) { + unsigned int * const cursor) { _dynar_lock(dynar); DEBUG1("Set cursor on %p to the first position",(void*)dynar); @@ -671,7 +685,7 @@ _xbt_dynar_cursor_first(const xbt_dynar_t dynar, */ void _xbt_dynar_cursor_step(const xbt_dynar_t dynar, - int * const cursor) { + unsigned int * const cursor) { (*cursor)++; } @@ -682,7 +696,7 @@ _xbt_dynar_cursor_step(const xbt_dynar_t dynar, */ int _xbt_dynar_cursor_get(const xbt_dynar_t dynar, - int * const cursor, + unsigned int * const cursor, void * const dst) { _sanity_check_dynar(dynar); @@ -695,7 +709,7 @@ _xbt_dynar_cursor_get(const xbt_dynar_t dynar, _dynar_unlock(dynar); return FALSE; } - DEBUG2("Cash out cursor on %p at %d",(void*)dynar,idx); + DEBUG2("Cash out cursor on %p at %lu",(void*)dynar,idx); _xbt_dynar_get_elm(dst, dynar, idx); } @@ -708,7 +722,7 @@ _xbt_dynar_cursor_get(const xbt_dynar_t dynar, * This function can be used while traversing without problem. */ void xbt_dynar_cursor_rm(xbt_dynar_t dynar, - int * const cursor) { + unsigned int * const cursor) { _xbt_dynar_remove_at(dynar,(*cursor)--,NULL); } @@ -734,7 +748,8 @@ XBT_LOG_DEFAULT_CATEGORY(xbt_dyn); XBT_TEST_UNIT("int",test_dynar_int,"Dynars of integers") { /* Vars_decl [doxygen cruft] */ xbt_dynar_t d; - int i,cpt,cursor; + int i,cpt; + unsigned int cursor; int *iptr; xbt_test_add0("==== Traverse the empty dynar"); @@ -879,7 +894,8 @@ XBT_TEST_UNIT("int",test_dynar_int,"Dynars of integers") { /*******************************************************************************/ XBT_TEST_UNIT("double",test_dynar_double,"Dynars of doubles") { xbt_dynar_t d; - int cpt,cursor; + int cpt; + unsigned int cursor; double d1,d2; xbt_test_add0("==== Traverse the empty dynar"); @@ -1000,12 +1016,13 @@ static void free_string(void *d){ XBT_TEST_UNIT("string",test_dynar_string,"Dyars of strings") { xbt_dynar_t d; int cpt; + unsigned int iter; char buf[1024]; char *s1,*s2; xbt_test_add0("==== Traverse the empty dynar"); d=xbt_dynar_new(sizeof(char *),&free_string); - xbt_dynar_foreach(d,cpt,s1){ + xbt_dynar_foreach(d,iter,s1){ xbt_test_assert0(FALSE, "Damnit, there is something in the empty dynar"); } @@ -1056,8 +1073,8 @@ XBT_TEST_UNIT("string",test_dynar_string,"Dyars of strings") { xbt_dynar_unshift(d,&s1); } /* 2. Traverse the dynar with the macro */ - xbt_dynar_foreach(d,cpt,s1) { - sprintf(buf,"%d",NB_ELEM - cpt -1); + xbt_dynar_foreach(d,iter,s1) { + sprintf(buf,"%d",NB_ELEM - iter -1); xbt_test_assert2 (!strcmp(buf,s1), "The retrieved value is not the same than the injected one (%s!=%s)", buf,s1);