X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/a45aaae8ebc4570ee3d14f2c4bfe2d6bc3aa177e..6a6157abf9619875297ff1d16c1e5c63c526d4c1:/src/gras/Transport/transport.c diff --git a/src/gras/Transport/transport.c b/src/gras/Transport/transport.c index 1b758cf526..e8a0213332 100644 --- a/src/gras/Transport/transport.c +++ b/src/gras/Transport/transport.c @@ -1,8 +1,7 @@ -/* $Id$ */ - /* transport - low level communication */ -/* Copyright (c) 2004 Martin Quinson. All rights reserved. */ +/* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010. The SimGrid Team. + * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -33,7 +32,7 @@ static void gras_trp_plugin_new(const char *name, gras_trp_setup_t setup) gras_trp_plugin_t plug = xbt_new0(s_gras_trp_plugin_t, 1); - DEBUG1("Create plugin %s", name); + XBT_DEBUG("Create plugin %s", name); plug->name = xbt_strdup(name); @@ -80,14 +79,14 @@ void gras_trp_init(void) xbt_assert0(LOBYTE(wsaData.wVersion) == 2 && HIBYTE(wsaData.wVersion) == 0, "Cannot find a usable WinSock DLL"); - INFO0("Found and initialized winsock2"); + XBT_INFO("Found and initialized winsock2"); } /* The WinSock DLL is acceptable. Proceed. */ #elif HAVE_WINSOCK_H { WSADATA wsaData; xbt_assert0(WSAStartup(0x0101, &wsaData) == 0, "Cannot find a usable WinSock DLL"); - INFO0("Found and initialized winsock"); + XBT_INFO("Found and initialized winsock"); } #endif @@ -102,7 +101,7 @@ void gras_trp_init(void) void gras_trp_exit(void) { - DEBUG1("gras_trp value %d", _gras_trp_started); + XBT_DEBUG("gras_trp value %d", _gras_trp_started); if (_gras_trp_started == 0) { return; } @@ -131,7 +130,7 @@ void gras_trp_plugin_free(void *p) if (plug->exit) { plug->exit(plug); } else if (plug->data) { - DEBUG1("Plugin %s lacks exit(). Free data anyway.", plug->name); + XBT_DEBUG("Plugin %s lacks exit(). Free data anyway.", plug->name); free(plug->data); } @@ -151,7 +150,7 @@ void gras_trp_socket_new(int incoming, gras_socket_t * dst) gras_socket_t sock = xbt_new0(s_gras_socket_t, 1); - VERB1("Create a new socket (%p)", (void *) sock); + XBT_VERB("Create a new socket (%p)", (void *) sock); sock->plugin = NULL; @@ -163,18 +162,15 @@ void gras_trp_socket_new(int incoming, gras_socket_t * dst) sock->valid = 1; sock->moredata = 0; + sock->refcount = 1; sock->sd = -1; - sock->port = -1; - sock->peer_port = -1; - sock->peer_name = NULL; - sock->peer_proc = NULL; sock->data = NULL; sock->bufdata = NULL; *dst = sock; - XBT_OUT; + XBT_OUT(); } /** @@ -194,22 +190,21 @@ gras_socket_server_ext(unsigned short port, gras_trp_plugin_t trp; gras_socket_t sock; - DEBUG2("Create a server socket from plugin %s on port %d", + XBT_DEBUG("Create a server socket from plugin %s on port %d", gras_if_RL()? "tcp" : "sg", port); trp = gras_trp_plugin_get_by_name(gras_if_SG()? "sg" : "tcp"); /* defaults settings */ gras_trp_socket_new(1, &sock); sock->plugin = trp; - sock->port = port; sock->buf_size = buf_size > 0 ? buf_size : 32 * 1024; sock->meas = measurement; /* Call plugin socket creation function */ - DEBUG1("Prepare socket with plugin (fct=%p)", trp->socket_server); + XBT_DEBUG("Prepare socket with plugin (fct=%p)", trp->socket_server); TRY { - trp->socket_server(trp, sock); - DEBUG3("in=%c out=%c accept=%c", + trp->socket_server(trp, port, sock); + XBT_DEBUG("in=%c out=%c accept=%c", sock->incoming ? 'y' : 'n', sock->outgoing ? 'y' : 'n', sock->accepting ? 'y' : 'n'); } CATCH(e) { @@ -219,10 +214,11 @@ gras_socket_server_ext(unsigned short port, } if (!measurement) - ((gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id))->myport = - port; + ((gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id))->myport + = port; xbt_dynar_push(((gras_trp_procdata_t) - gras_libdata_by_id(gras_trp_libdata_id))->sockets, &sock); + gras_libdata_by_id(gras_trp_libdata_id))->sockets, + &sock); gras_msg_listener_awake(); return sock; @@ -283,19 +279,18 @@ gras_socket_client_ext(const char *host, trp = gras_trp_plugin_get_by_name(gras_if_SG()? "sg" : "tcp"); - DEBUG1("Create a client socket from plugin %s", gras_if_RL()? "tcp" : "sg"); + XBT_DEBUG("Create a client socket from plugin %s", + gras_if_RL()? "tcp" : "sg"); /* defaults settings */ gras_trp_socket_new(0, &sock); sock->plugin = trp; - sock->peer_port = port; - sock->peer_name = (char *) strdup(host ? host : "localhost"); sock->buf_size = buf_size > 0 ? buf_size : 32 * 1024; sock->meas = measurement; /* plugin-specific */ TRY { - (*trp->socket_client) (trp, sock); - DEBUG3("in=%c out=%c accept=%c", + (*trp->socket_client) (trp,host,port,sock); + XBT_DEBUG("in=%c out=%c accept=%c", sock->incoming ? 'y' : 'n', sock->outgoing ? 'y' : 'n', sock->accepting ? 'y' : 'n'); } CATCH(e) { @@ -303,7 +298,8 @@ gras_socket_client_ext(const char *host, RETHROW; } xbt_dynar_push(((gras_trp_procdata_t) - gras_libdata_by_id(gras_trp_libdata_id))->sockets, &sock); + gras_libdata_by_id(gras_trp_libdata_id))->sockets, + &sock); gras_msg_listener_awake(); return sock; } @@ -333,53 +329,61 @@ gras_socket_t gras_socket_client_from_string(const char *host) return res; } +void gras_socket_close_voidp(void *sock) +{ + gras_socket_close((gras_socket_t) sock); +} + /** \brief Close socket */ void gras_socket_close(gras_socket_t sock) { + if (--sock->refcount) + return; + xbt_dynar_t sockets = - ((gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id))->sockets; + ((gras_trp_procdata_t) + gras_libdata_by_id(gras_trp_libdata_id))->sockets; gras_socket_t sock_iter = NULL; unsigned int cursor; - XBT_IN; - VERB1("Close %p", sock); + XBT_IN(""); + XBT_VERB("Close %p", sock); if (sock == _gras_lastly_selected_socket) { xbt_assert0(!gras_opt_trp_nomoredata_on_close || !sock->moredata, "Closing a socket having more data in buffer while the nomoredata_on_close option is activated"); if (sock->moredata) - CRITICAL0 - ("Closing a socket having more data in buffer. Option nomoredata_on_close disabled, so continuing."); + XBT_CRITICAL + ("Closing a socket having more data in buffer. Option nomoredata_on_close disabled, so continuing."); _gras_lastly_selected_socket = NULL; } /* FIXME: Issue an event when the socket is closed */ - DEBUG1("sockets pointer before %p", sockets); + XBT_DEBUG("sockets pointer before %p", sockets); if (sock) { /* 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_DEBUG("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_OUT(); return; } } - WARN1("Ignoring request to free an unknown socket (%p). Execution stack:", - sock); + XBT_WARN + ("Ignoring request to free an unknown socket (%p). Execution stack:", + sock); xbt_backtrace_display_current(); } - XBT_OUT; + XBT_OUT(); } /** @@ -423,27 +427,33 @@ gras_trp_plugin_t gras_trp_plugin_get_by_name(const char *name) int gras_socket_my_port(gras_socket_t sock) { - return sock->port; + if (!sock->plugin->my_port) + THROW1(unknown_error,0,"Function my_port unimplemented in plugin %s",sock->plugin->name); + return (*sock->plugin->my_port)(sock); + } int gras_socket_peer_port(gras_socket_t sock) { - return sock->peer_port; + if (!sock->plugin->peer_port) + THROW1(unknown_error,0,"Function peer_port unimplemented in plugin %s",sock->plugin->name); + return (*sock->plugin->peer_port)(sock); } -char *gras_socket_peer_name(gras_socket_t sock) +const char *gras_socket_peer_name(gras_socket_t sock) { - return sock->peer_name; + xbt_assert(sock->plugin); + return (*sock->plugin->peer_name)(sock); } -char *gras_socket_peer_proc(gras_socket_t sock) +const char *gras_socket_peer_proc(gras_socket_t sock) { - return sock->peer_proc; + return (*sock->plugin->peer_proc)(sock); } void gras_socket_peer_proc_set(gras_socket_t sock, char *peer_proc) { - sock->peer_proc = peer_proc; + return (*sock->plugin->peer_proc_set)(sock,peer_proc); } /** \brief Check if the provided socket is a measurement one (or a regular one) */ @@ -479,8 +489,9 @@ void gras_socket_meas_send(gras_socket_t peer, char *chunk = NULL; unsigned long int sent_sofar; - XBT_IN; - + XBT_IN(""); + THROW0(unknown_error,0,"measurement sockets were broken in this release of SimGrid and should be ported back in the future." + "If you depend on it, sorry, you have to use an older version, or wait for the future version using it..."); if (gras_if_RL()) chunk = xbt_malloc0(msg_size); @@ -490,20 +501,21 @@ void gras_socket_meas_send(gras_socket_t peer, "Socket not suited for data send (was created with gras_socket_server(), not gras_socket_client())"); 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), + XBT_CDEBUG(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 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)); + XBT_CDEBUG(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()) free(chunk); - XBT_OUT; + XBT_OUT(); } /** \brief Receive a chunk of data over a measurement socket @@ -525,7 +537,9 @@ void gras_socket_meas_recv(gras_socket_t peer, char *chunk = NULL; unsigned long int got_sofar; - XBT_IN; + XBT_IN(""); + THROW0(unknown_error,0,"measurement sockets were broken in this release of SimGrid and should be ported back in the future." + "If you depend on it, sorry, you have to use an older version, or wait for the future version using it..."); if (gras_if_RL()) chunk = xbt_malloc(msg_size); @@ -535,20 +549,20 @@ void gras_socket_meas_recv(gras_socket_t peer, xbt_assert0(peer->incoming, "Socket not suited for data receive"); 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), + XBT_CDEBUG(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 msgs of %lu (size of each: %ld) from %s:%d", got_sofar, - msg_amount, msg_size, gras_socket_peer_name(peer), + XBT_CDEBUG(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()) free(chunk); - XBT_OUT; + XBT_OUT(); } /** @@ -566,6 +580,8 @@ void gras_socket_meas_recv(gras_socket_t peer, gras_socket_t gras_socket_meas_accept(gras_socket_t peer) { gras_socket_t res; + THROW0(unknown_error,0,"measurement sockets were broken in this release of SimGrid and should be ported back in the future." + "If you depend on it, sorry, you have to use an older version, or wait for the future version using it..."); xbt_assert0(peer->meas, "No need to accept on non-measurement sockets (it's automatic)"); @@ -578,7 +594,7 @@ gras_socket_t gras_socket_meas_accept(gras_socket_t peer) res = (peer->plugin->socket_accept) (peer); res->meas = peer->meas; - CDEBUG1(gras_trp_meas, "meas_accepted onto %d", res->sd); + XBT_CDEBUG(gras_trp_meas, "meas_accepted onto %d", res->sd); return res; } @@ -614,18 +630,18 @@ static void gras_trp_procdata_free(void *data) void gras_trp_socketset_dump(const char *name) { gras_trp_procdata_t procdata = - (gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id); + (gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id); unsigned int it; gras_socket_t s; - INFO1("** Dump the socket set %s", name); + XBT_INFO("** Dump the socket set %s", name); xbt_dynar_foreach(procdata->sockets, it, s) { - INFO4(" %p -> %s:%d %s", + XBT_INFO(" %p -> %s:%d %s", s, gras_socket_peer_name(s), gras_socket_peer_port(s), s->valid ? "(valid)" : "(peer dead)"); } - INFO1("** End of socket set %s", name); + XBT_INFO("** End of socket set %s", name); } /* @@ -635,8 +651,8 @@ int gras_trp_libdata_id; void gras_trp_register() { gras_trp_libdata_id = - gras_procdata_add("gras_trp", gras_trp_procdata_new, - gras_trp_procdata_free); + gras_procdata_add("gras_trp", gras_trp_procdata_new, + gras_trp_procdata_free); } int gras_os_myport(void)