X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/852138539bcbd3a5bc0fd928ab7bf99e0883b38e..f7c38a5c54c0ec04663ee41183bf583edea6c856:/src/gras/Transport/transport.c?ds=sidebyside diff --git a/src/gras/Transport/transport.c b/src/gras/Transport/transport.c index 41bed37eb4..4f5fe776bf 100644 --- a/src/gras/Transport/transport.c +++ b/src/gras/Transport/transport.c @@ -97,10 +97,7 @@ void gras_trp_init(void){ void gras_trp_exit(void){ - xbt_dynar_t sockets = ((gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id))->sockets; - gras_socket_t sock_iter; - int cursor; - + DEBUG1("gras_trp value %d",_gras_trp_started); if (_gras_trp_started == 0) { return; } @@ -115,13 +112,6 @@ gras_trp_exit(void){ } #endif - /* Close all the sockets */ - xbt_dynar_foreach(sockets,cursor,sock_iter) { - VERB1("Closing the socket %p left open on exit. Maybe a socket leak?", - sock_iter); - gras_socket_close(sock_iter); - } - /* Delete the plugins */ xbt_dict_free(&_gras_trp_plugins); } @@ -226,8 +216,9 @@ gras_socket_server_ext(unsigned short port, gras_socket_t sock_iter; xbt_dynar_t socks = ((gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id))->sockets; xbt_dynar_foreach(socks, cursor, sock_iter) { - if (sock_iter==sock) - xbt_dynar_cursor_rm(socks,&cursor); + if (sock_iter==sock) { + xbt_dynar_cursor_rm(socks,&cursor); + } } free(sock); RETHROW; @@ -308,7 +299,9 @@ gras_socket_client_ext(const char *host, sock->outgoing?'y':'n', sock->accepting?'y':'n'); } CATCH(e) { - free(sock); + xbt_dynar_pop(((gras_trp_procdata_t) + gras_libdata_by_id(gras_trp_libdata_id))->sockets,NULL); + free(sock); RETHROW; } @@ -360,23 +353,26 @@ 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) { - if (sock == sock_iter) { - xbt_dynar_cursor_rm(sockets,&cursor); - if (sock->plugin->socket_close) - (* sock->plugin->socket_close)(sock); - - /* free the memory */ - if (sock->peer_name) - free(sock->peer_name); - free(sock); - XBT_OUT; - return; - } + xbt_dynar_foreach(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); + if (sock->plugin->socket_close) + (* sock->plugin->socket_close)(sock); + + /* free the memory */ + if (sock->peer_name) + free(sock->peer_name); + free(sock); + XBT_OUT; + xbt_dynar_cursor_unlock(sockets); + return; + } } WARN1("Ignoring request to free an unknown socket (%p). Execution stack:",sock); - xbt_backtrace_display(); + xbt_backtrace_display_current(); } XBT_OUT; } @@ -445,8 +441,8 @@ int gras_socket_is_meas(gras_socket_t sock) { * * @param peer measurement socket to use for the experiment * @param timeout timeout (in seconds) - * @param exp_size total amount of data to send (in bytes). * @param msg_size size of each chunk sent over the socket (in bytes). + * @param msg_amount how many of these packets you want to send. * * Calls to gras_socket_meas_send() and gras_socket_meas_recv() on * each side of the socket should be paired. @@ -454,14 +450,18 @@ int gras_socket_is_meas(gras_socket_t sock) { * The exchanged data is zeroed to make sure it's initialized, but * there is no way to control what is sent (ie, you cannot use these * functions to exchange data out of band). + * + * @warning: in SimGrid version 3.1 and previous, the numerical arguments + * were the total amount of data to send and the msg_size. This + * was changed for the fool wanting to send more than MAXINT + * bytes in a fat pipe. */ void gras_socket_meas_send(gras_socket_t peer, unsigned int timeout, - unsigned long int exp_size, - unsigned long int msg_size) { + unsigned long int msg_size, + unsigned long int msg_amount) { char *chunk=NULL; - unsigned long int exp_sofar; - unsigned long int chunk_size = 0; + unsigned long int sent_sofar; XBT_IN; @@ -471,17 +471,14 @@ void gras_socket_meas_send(gras_socket_t peer, xbt_assert0(peer->meas,"Asked to send measurement data on a regular socket"); xbt_assert0(peer->outgoing,"Socket not suited for data send (was created with gras_socket_server(), not gras_socket_client())"); - for (exp_sofar=0; exp_sofar < exp_size; exp_sofar += chunk_size) { - chunk_size = exp_sofar + msg_size > exp_size ? - exp_size - exp_sofar : msg_size; - CDEBUG6(gras_trp_meas,"Sent %lu of %lu (msg_size=%ld) to %s:%d, sending %lu", - exp_sofar,exp_size,msg_size, - gras_socket_peer_name(peer), gras_socket_peer_port(peer), - chunk_size); - (*peer->plugin->raw_send)(peer,chunk,chunk_size); + for (sent_sofar=0; sent_sofar < msg_amount; sent_sofar++) { + CDEBUG5(gras_trp_meas,"Sent %lu msgs of %lu (size of each: %ld) to %s:%d", + sent_sofar,msg_amount,msg_size, + gras_socket_peer_name(peer), gras_socket_peer_port(peer)); + (*peer->plugin->raw_send)(peer,chunk,msg_size); } - CDEBUG5(gras_trp_meas,"Sent %lu of %lu (msg_size=%ld) to %s:%d", - exp_sofar,exp_size,msg_size, + CDEBUG5(gras_trp_meas,"Sent %lu msgs of %lu (size of each: %ld) to %s:%d", + sent_sofar,msg_amount,msg_size, gras_socket_peer_name(peer), gras_socket_peer_port(peer)); if (gras_if_RL()) @@ -494,15 +491,19 @@ void gras_socket_meas_send(gras_socket_t peer, * * Calls to gras_socket_meas_send() and gras_socket_meas_recv() on * each side of the socket should be paired. + * + * @warning: in SimGrid version 3.1 and previous, the numerical arguments + * were the total amount of data to send and the msg_size. This + * was changed for the fool wanting to send more than MAXINT + * bytes in a fat pipe. */ void gras_socket_meas_recv(gras_socket_t peer, unsigned int timeout, - unsigned long int exp_size, - unsigned long int msg_size){ + unsigned long int msg_size, + unsigned long int msg_amount){ char *chunk=NULL; - unsigned long int exp_sofar; - unsigned long int chunk_size = 0; + unsigned long int got_sofar; XBT_IN; @@ -513,17 +514,14 @@ void gras_socket_meas_recv(gras_socket_t peer, "Asked to receive measurement data on a regular socket"); xbt_assert0(peer->incoming,"Socket not suited for data receive"); - for (exp_sofar=0; exp_sofar < exp_size; exp_sofar += chunk_size) { - chunk_size = exp_sofar + msg_size > exp_size ? - exp_size - exp_sofar : msg_size; - CDEBUG6(gras_trp_meas,"Recvd %ld of %lu (msg_size=%ld) from %s:%d, receiving %lu", - exp_sofar,exp_size,msg_size, - gras_socket_peer_name(peer), gras_socket_peer_port(peer), - chunk_size); - (peer->plugin->raw_recv)(peer,chunk,chunk_size); + for (got_sofar=0; got_sofar < msg_amount; got_sofar ++) { + CDEBUG5(gras_trp_meas,"Recvd %ld msgs of %lu (size of each: %ld) from %s:%d", + got_sofar,msg_amount,msg_size, + gras_socket_peer_name(peer), gras_socket_peer_port(peer)); + (peer->plugin->raw_recv)(peer,chunk,msg_size); } - CDEBUG5(gras_trp_meas,"Recvd %ld of %lu (msg_size=%ld) from %s:%d", - exp_sofar,exp_size,msg_size, + CDEBUG5(gras_trp_meas,"Recvd %ld msgs of %lu (size of each: %ld) from %s:%d", + got_sofar,msg_amount,msg_size, gras_socket_peer_name(peer), gras_socket_peer_port(peer)); if (gras_if_RL()) @@ -571,7 +569,7 @@ static void *gras_trp_procdata_new() { res->name = xbt_strdup("gras_trp"); res->name_len = 0; - res->sockets = xbt_dynar_new(sizeof(gras_socket_t*), NULL); + res->sockets = xbt_dynar_new_sync(sizeof(gras_socket_t*), NULL); res->myport = 0; return (void*)res;