From 79b7fcc6dfb026ac94df11b5610ba84dde5b2c84 Mon Sep 17 00:00:00 2001 From: donassbr Date: Mon, 16 Jul 2007 13:33:49 +0000 Subject: [PATCH] Undo dynar changes ("recursive" mutex). Added functions to remove data if we're inside of foreach. Changes in gras to work with the "sync dynar". I tested only with some SG examples. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@3802 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- src/gras/Transport/rl_transport.c | 2 + src/gras/Transport/transport.c | 8 ++- src/xbt/dynar.c | 94 +++++++++++++++---------------- src/xbt/dynar_private.h | 3 - 4 files changed, 54 insertions(+), 53 deletions(-) diff --git a/src/gras/Transport/rl_transport.c b/src/gras/Transport/rl_transport.c index e96d6752f5..031c1e62bb 100644 --- a/src/gras/Transport/rl_transport.c +++ b/src/gras/Transport/rl_transport.c @@ -175,10 +175,12 @@ gras_socket_t gras_trp_select(double timeout) { gras_socket_t accepted=NULL; /* release mutex before accept */ + xbt_dynar_cursor_unlock(sockets); accepted = (sock_iter->plugin->socket_accept)(sock_iter); DEBUG2("accepted=%p,&accepted=%p",accepted,&accepted); accepted->meas = sock_iter->meas; + break; } else if (sock_iter->recv_ok) { /* Make sure the socket is still alive by reading the first byte */ diff --git a/src/gras/Transport/transport.c b/src/gras/Transport/transport.c index 4f5fe776bf..27f5274fc7 100644 --- a/src/gras/Transport/transport.c +++ b/src/gras/Transport/transport.c @@ -338,7 +338,7 @@ gras_socket_client_from_string(const char *host) { /** \brief Close socket */ void gras_socket_close(gras_socket_t sock) { xbt_dynar_t sockets = ((gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id))->sockets; - gras_socket_t sock_iter; + gras_socket_t sock_iter = NULL; int cursor; XBT_IN; @@ -355,7 +355,10 @@ void gras_socket_close(gras_socket_t sock) { /* FIXME: Issue an event when the socket is closed */ DEBUG1("sockets pointer before %p",sockets); if (sock) { - xbt_dynar_foreach(sockets,cursor,sock_iter) { + /* FIXME: Cannot get the dynar mutex, because it can be already locked */ +// _xbt_dynar_foreach(sockets,cursor,sock_iter) { + for (cursor=0; cursor< xbt_dynar_length(sockets); cursor++) { + _xbt_dynar_cursor_get(sockets,&cursor,&sock_iter); if (sock == sock_iter) { DEBUG2("remove sock cursor %d dize %lu\n",cursor,xbt_dynar_length(sockets)); xbt_dynar_cursor_rm(sockets,&cursor); @@ -367,7 +370,6 @@ void gras_socket_close(gras_socket_t sock) { free(sock->peer_name); free(sock); XBT_OUT; - xbt_dynar_cursor_unlock(sockets); return; } } diff --git a/src/xbt/dynar.c b/src/xbt/dynar.c index 1d8786f569..df177bf7a4 100644 --- a/src/xbt/dynar.c +++ b/src/xbt/dynar.c @@ -25,7 +25,12 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_dyn,xbt,"Dynamic arrays"); - +#define _dynar_lock(dynar) \ + if (dynar->mutex) \ + xbt_mutex_lock(dynar->mutex) +#define _dynar_unlock(dynar) \ + if (dynar->mutex) \ + xbt_mutex_unlock(dynar->mutex) #define _sanity_check_dynar(dynar) \ xbt_assert0(dynar, \ "dynar is NULL") @@ -48,6 +53,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_dyn,xbt,"Dynamic arrays"); THROW1(bound_error,0, \ "dynar %p is empty", dynar) + static XBT_INLINE void _xbt_clear_mem(void * const ptr, const unsigned long length) { @@ -119,6 +125,44 @@ _xbt_dynar_put_elm(const xbt_dynar_t dynar, memcpy(elm, src, elmsize); } +static XBT_INLINE +void +_xbt_dynar_remove_at(xbt_dynar_t const dynar, + const int idx, + void * const object) { + + unsigned long nb_shift; + unsigned long offset; + + _sanity_check_dynar(dynar); + _sanity_check_idx(idx); + _check_inbound_idx(dynar, idx); + + if (object) { + _xbt_dynar_get_elm(object, dynar, idx); + } else if (dynar->free_f) { + if (dynar->elmsize <= SIZEOF_MAX) { + char elm[SIZEOF_MAX]; + _xbt_dynar_get_elm(elm, dynar, idx); + (*dynar->free_f)(elm); + } else { + char *elm=malloc(dynar->elmsize); + _xbt_dynar_get_elm(elm, dynar, idx); + (*dynar->free_f)(elm); + free(elm); + } + } + + nb_shift = dynar->used-1 - idx; + offset = nb_shift * dynar->elmsize; + + memmove(_xbt_dynar_elm(dynar, idx), + _xbt_dynar_elm(dynar, idx+1), + offset); + + dynar->used--; +} + void xbt_dynar_dump(xbt_dynar_t dynar) { INFO5("Dynar dump: size=%lu; used=%lu; elmsize=%lu; data=%p; free_f=%p", @@ -160,7 +204,6 @@ xbt_dynar_new_sync(const unsigned long elmsize, void_f_pvoid_t * const free_f) { xbt_dynar_t res = xbt_dynar_new(elmsize,free_f); res->mutex = xbt_mutex_init(); - res->synchro_process_pid = -1; return res; } @@ -454,37 +497,8 @@ xbt_dynar_remove_at(xbt_dynar_t const dynar, const int idx, void * const object) { - unsigned long nb_shift; - unsigned long offset; - _dynar_lock(dynar); - _sanity_check_dynar(dynar); - _sanity_check_idx(idx); - _check_inbound_idx(dynar, idx); - - if (object) { - _xbt_dynar_get_elm(object, dynar, idx); - } else if (dynar->free_f) { - if (dynar->elmsize <= SIZEOF_MAX) { - char elm[SIZEOF_MAX]; - _xbt_dynar_get_elm(elm, dynar, idx); - (*dynar->free_f)(elm); - } else { - char *elm=malloc(dynar->elmsize); - _xbt_dynar_get_elm(elm, dynar, idx); - (*dynar->free_f)(elm); - free(elm); - } - } - - nb_shift = dynar->used-1 - idx; - offset = nb_shift * dynar->elmsize; - - memmove(_xbt_dynar_elm(dynar, idx), - _xbt_dynar_elm(dynar, idx+1), - offset); - - dynar->used--; + _xbt_dynar_remove_at(dynar, idx, object); _dynar_unlock(dynar); } @@ -687,7 +701,7 @@ _xbt_dynar_cursor_get(const xbt_dynar_t dynar, void xbt_dynar_cursor_rm(xbt_dynar_t dynar, int * const cursor) { - xbt_dynar_remove_at(dynar,(*cursor)--,NULL); + _xbt_dynar_remove_at(dynar,(*cursor)--,NULL); } /** @brief Unlocks a synchronized dynar when you want to break the traversal @@ -700,20 +714,6 @@ void xbt_dynar_cursor_unlock(xbt_dynar_t dynar) { _dynar_unlock(dynar); } -void _dynar_lock(xbt_dynar_t dynar) { - if ( (dynar->mutex) && (dynar->synchro_process_pid != xbt_getpid()) ) { - xbt_mutex_lock(dynar->mutex); - dynar->synchro_process_pid = xbt_getpid(); - } - -} -void _dynar_unlock(xbt_dynar_t dynar) { - if (dynar->mutex) { - xbt_mutex_unlock(dynar->mutex); - dynar->synchro_process_pid = -1; - } -} - #ifdef SIMGRID_TEST #define NB_ELEM 5000 diff --git a/src/xbt/dynar_private.h b/src/xbt/dynar_private.h index 1bcbac5a71..46ad623045 100644 --- a/src/xbt/dynar_private.h +++ b/src/xbt/dynar_private.h @@ -18,9 +18,6 @@ typedef struct xbt_dynar_s { void *data; void_f_pvoid_t *free_f; xbt_mutex_t mutex; - int synchro_process_pid; } s_xbt_dynar_t; -void _dynar_unlock(xbt_dynar_t); -void _dynar_lock(xbt_dynar_t dynar); #endif /* DYNAR_PRIVATE_H */ -- 2.20.1