X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/dff9e15c44ab6340d27215957c56fa72fad246a2..513fa16f2016befe3aa9ba0ca7eb61c5ad96349c:/include/xbt/dynar.h diff --git a/include/xbt/dynar.h b/include/xbt/dynar.h index 6d7b090b97..a4af07b372 100644 --- a/include/xbt/dynar.h +++ b/include/xbt/dynar.h @@ -10,6 +10,7 @@ #ifndef _XBT_DYNAR_H #define _XBT_DYNAR_H +#include /* memcpy */ #include "xbt/misc.h" /* SG_BEGIN_DECL */ #include "xbt/function_types.h" @@ -65,11 +66,11 @@ XBT_PUBLIC(xbt_dynar_t) xbt_dynar_new(const unsigned long elm_size, void_f_pvoid_t const free_f); XBT_PUBLIC(xbt_dynar_t) xbt_dynar_new_sync(const unsigned long elm_size, void_f_pvoid_t const free_f); -XBT_PUBLIC(void) xbt_dynar_free(xbt_dynar_t * dynar); +XBT_INLINE XBT_PUBLIC(void) xbt_dynar_free(xbt_dynar_t * dynar); XBT_PUBLIC(void) xbt_dynar_free_voidp(void *dynar); XBT_PUBLIC(void) xbt_dynar_free_container(xbt_dynar_t * dynar); -XBT_PUBLIC(unsigned long) xbt_dynar_length(const xbt_dynar_t dynar); +XBT_INLINE XBT_PUBLIC(unsigned long) xbt_dynar_length(const xbt_dynar_t dynar); XBT_PUBLIC(void) xbt_dynar_reset(xbt_dynar_t const dynar); XBT_PUBLIC(void) xbt_dynar_shrink(xbt_dynar_t dynar, int empty_slots); @@ -104,8 +105,8 @@ XBT_PUBLIC(int) xbt_dynar_member(xbt_dynar_t const dynar, void *elem); * @{ */ -XBT_PUBLIC(void) xbt_dynar_push(xbt_dynar_t const dynar, const void *src); -XBT_PUBLIC(void) xbt_dynar_pop(xbt_dynar_t const dynar, void *const dst); +XBT_INLINE XBT_PUBLIC(void) xbt_dynar_push(xbt_dynar_t const dynar, const void *src); +XBT_INLINE XBT_PUBLIC(void) xbt_dynar_pop(xbt_dynar_t const dynar, void *const dst); XBT_PUBLIC(void) xbt_dynar_unshift(xbt_dynar_t const dynar, const void *src); XBT_PUBLIC(void) xbt_dynar_shift(xbt_dynar_t const dynar, void *const dst); XBT_PUBLIC(void) xbt_dynar_map(const xbt_dynar_t dynar, @@ -120,7 +121,7 @@ XBT_PUBLIC(void) xbt_dynar_map(const xbt_dynar_t dynar, * @{ */ -XBT_PUBLIC(void *) xbt_dynar_get_ptr(const xbt_dynar_t dynar, +XBT_INLINE XBT_PUBLIC(void *) xbt_dynar_get_ptr(const xbt_dynar_t dynar, const unsigned long idx); XBT_PUBLIC(void *) xbt_dynar_insert_at_ptr(xbt_dynar_t const dynar, const int idx); @@ -181,17 +182,57 @@ XBT_PUBLIC(void *) xbt_dynar_pop_ptr(xbt_dynar_t const dynar); * @{ */ -XBT_PUBLIC(void) _xbt_dynar_cursor_first(const xbt_dynar_t dynar, - unsigned int *const cursor); -XBT_PUBLIC(void) _xbt_dynar_cursor_step(const xbt_dynar_t dynar, - unsigned int *const cursor); -XBT_PUBLIC(int) _xbt_dynar_cursor_get(const xbt_dynar_t dynar, - unsigned int *const cursor, - void *whereto); -XBT_PUBLIC(void) xbt_dynar_cursor_rm(xbt_dynar_t dynar, +XBT_INLINE XBT_PUBLIC(void) xbt_dynar_cursor_rm(xbt_dynar_t dynar, unsigned int *const cursor); XBT_PUBLIC(void) xbt_dynar_cursor_unlock(xbt_dynar_t dynar); +/* do not use this structure internals directly, but use the public interface + * This was made public to allow: + * - the inlining of the foreach elements + * - sending such beasts over the network + */ + +#include "xbt/synchro_core.h" +typedef struct xbt_dynar_s { + unsigned long size; + unsigned long used; + unsigned long elmsize; + void *data; + void_f_pvoid_t free_f; + xbt_mutex_t mutex; +} s_xbt_dynar_t; + +static XBT_INLINE void +_xbt_dynar_cursor_first(const xbt_dynar_t dynar, unsigned int *const cursor) +{ + /* don't test for dynar!=NULL. The segfault would tell us */ + if (dynar->mutex) /* ie _dynar_lock(dynar) but not public */ + xbt_mutex_acquire(dynar->mutex); + + //DEBUG1("Set cursor on %p to the first position", (void *) dynar); + *cursor = 0; +} + +static XBT_INLINE int +_xbt_dynar_cursor_get(const xbt_dynar_t dynar, + unsigned int idx, void *const dst) +{ + + if (idx >= dynar->used) { + //DEBUG1("Cursor on %p already on last elem", (void *) dynar); + if (dynar->mutex) /* unlock */ + xbt_mutex_release(dynar->mutex); + return FALSE; + } + // DEBUG2("Cash out cursor on %p at %u", (void *) dynar, *idx); + + memcpy(dst, ((char*)dynar->data) + idx * dynar->elmsize, dynar->elmsize); + + return TRUE; +} + + + /** @brief Iterates over the whole dynar. * * @param _dynar what to iterate over @@ -211,8 +252,8 @@ xbt_dynar_foreach (dyn,cpt,str) { */ #define xbt_dynar_foreach(_dynar,_cursor,_data) \ for (_xbt_dynar_cursor_first(_dynar,&(_cursor)) ; \ - _xbt_dynar_cursor_get(_dynar,&(_cursor),&_data) ; \ - _xbt_dynar_cursor_step(_dynar,&(_cursor)) ) + _xbt_dynar_cursor_get(_dynar,_cursor,&_data) ; \ + (_cursor)++ ) /** @} */