X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7b643b5afd98b28e54b82339284af43b1ab7f5ca..1a2592601e29b027872580cbfc364194f8b01ba6:/src/gras/Transport/transport_plugin_sg.c diff --git a/src/gras/Transport/transport_plugin_sg.c b/src/gras/Transport/transport_plugin_sg.c index 55bc0d240b..57c12c3a72 100644 --- a/src/gras/Transport/transport_plugin_sg.c +++ b/src/gras/Transport/transport_plugin_sg.c @@ -12,6 +12,7 @@ #include "xbt/ex.h" +#include "simix/simix.h" #include "gras/Msg/msg_private.h" #include "gras/Transport/transport_private.h" #include "gras/Virtu/virtu_sg.h" @@ -27,8 +28,11 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_trp_sg, gras_trp, static gras_sg_portrec_t find_port(gras_hostdata_t * hd, int port); void gras_trp_sg_socket_client(gras_trp_plugin_t self, + const char*host, + int port, /* OUT */ gras_socket_t sock); void gras_trp_sg_socket_server(gras_trp_plugin_t self, + int port, /* OUT */ gras_socket_t sock); void gras_trp_sg_socket_close(gras_socket_t sd); @@ -66,10 +70,46 @@ static gras_sg_portrec_t find_port(gras_hostdata_t * hd, int port) return NULL; } +/*** + *** Info about who's speaking + ***/ +static int gras_trp_sg_my_port(gras_socket_t s) { + gras_trp_sg_sock_data_t sockdata = s->data; + if (sockdata->rdv_client == NULL) /* Master socket, I'm server */ + return sockdata->server_port; + else + return sockdata->client_port; +} +static int gras_trp_sg_peer_port(gras_socket_t s) { + gras_trp_sg_sock_data_t sockdata = s->data; + if (sockdata->server == SIMIX_process_self()) + return sockdata->client_port; + else + return sockdata->server_port; +} +static const char* gras_trp_sg_peer_name(gras_socket_t s) { + gras_trp_sg_sock_data_t sockdata = s->data; + if (sockdata->server == SIMIX_process_self()) + return SIMIX_host_get_name(SIMIX_process_get_host(sockdata->client)); + else + return SIMIX_host_get_name(SIMIX_process_get_host(sockdata->server)); +} +static const char* gras_trp_sg_peer_proc(gras_socket_t s) { + THROW_UNIMPLEMENTED; +} +static void gras_trp_sg_peer_proc_set(gras_socket_t s,char *name) { + THROW_UNIMPLEMENTED; +} void gras_trp_sg_setup(gras_trp_plugin_t plug) { + plug->my_port = gras_trp_sg_my_port; + plug->peer_port = gras_trp_sg_peer_port; + plug->peer_name = gras_trp_sg_peer_name; + plug->peer_proc = gras_trp_sg_peer_proc; + plug->peer_proc_set = gras_trp_sg_peer_proc_set; + gras_trp_sg_plug_data_t *data = xbt_new(gras_trp_sg_plug_data_t, 1); plug->data = data; @@ -86,7 +126,10 @@ void gras_trp_sg_setup(gras_trp_plugin_t plug) } void gras_trp_sg_socket_client(gras_trp_plugin_t self, - /* OUT */ gras_socket_t sock) { + const char*host, + int port, + /* OUT */ gras_socket_t sock) +{ smx_host_t peer; gras_hostdata_t *hd; @@ -94,44 +137,47 @@ void gras_trp_sg_socket_client(gras_trp_plugin_t self, gras_sg_portrec_t pr; /* make sure this socket will reach someone */ - if (!(peer = SIMIX_host_get_by_name(sock->peer_name))) + if (!(peer = SIMIX_host_get_by_name(host))) THROW1(mismatch_error, 0, - "Can't connect to %s: no such host.\n", sock->peer_name); + "Can't connect to %s: no such host.\n", host); if (!(hd = (gras_hostdata_t *) SIMIX_host_get_data(peer))) THROW1(mismatch_error, 0, - "can't connect to %s: no process on this host", sock->peer_name); + "can't connect to %s: no process on this host", + host); - pr = find_port(hd, sock->peer_port); + pr = find_port(hd, port); if (pr == NULL) { THROW2(mismatch_error, 0, - "can't connect to %s:%d, no process listen on this port", - sock->peer_name, sock->peer_port); + "can't connect to %s:%d, no process listen on this port", + host, port); } /* Ensure that the listener is expecting the kind of stuff we want to send */ if (pr->meas && !sock->meas) { THROW2(mismatch_error, 0, "can't connect to %s:%d in regular mode, the process listen " - "in measurement mode on this port", sock->peer_name, - sock->peer_port); + "in measurement mode on this port", host, + port); } if (!pr->meas && sock->meas) { THROW2(mismatch_error, 0, "can't connect to %s:%d in measurement mode, the process listen " - "in regular mode on this port", sock->peer_name, sock->peer_port); + "in regular mode on this port", host, + port); } /* create simulation data of the socket */ data = xbt_new(s_gras_trp_sg_sock_data_t, 1); data->client = SIMIX_process_self(); data->server = pr->server; + data->server_port = port; /* initialize synchronization stuff on the socket */ data->rdv_server = pr->rdv; data->rdv_client = SIMIX_rdv_create(NULL); - data->comm_recv = SIMIX_network_irecv(data->rdv_client,NULL,0); + data->comm_recv = SIMIX_network_irecv(data->rdv_client, NULL, 0); /* connect that simulation data to the socket */ sock->data = data; @@ -139,14 +185,15 @@ void gras_trp_sg_socket_client(gras_trp_plugin_t self, DEBUG5("%s (PID %d) connects in %s mode to %s:%d", SIMIX_process_get_name(SIMIX_process_self()), gras_os_getpid(), - sock->meas ? "meas" : "regular", sock->peer_name, sock->peer_port); + sock->meas ? "meas" : "regular", host, + port); } -void gras_trp_sg_socket_server(gras_trp_plugin_t self, gras_socket_t sock) +void gras_trp_sg_socket_server(gras_trp_plugin_t self, int port, gras_socket_t sock) { gras_hostdata_t *hd = - (gras_hostdata_t *) SIMIX_host_get_data(SIMIX_host_self()); + (gras_hostdata_t *) SIMIX_host_get_data(SIMIX_host_self()); gras_sg_portrec_t pr; gras_trp_sg_sock_data_t data; @@ -155,16 +202,16 @@ void gras_trp_sg_socket_server(gras_trp_plugin_t self, gras_socket_t sock) sock->accepting = 1; /* Check whether a server is already listening on that port or not */ - pr = find_port(hd, sock->port); + pr = find_port(hd, port); if (pr) THROW2(mismatch_error, 0, "can't listen on address %s:%d: port already in use.", - SIMIX_host_get_name(SIMIX_host_self()), sock->port); + SIMIX_host_get_name(SIMIX_host_self()), port); /* This port is free, let's take it */ - pr = xbt_new(s_gras_sg_portrec_t,1); - pr->port = sock->port; + pr = xbt_new(s_gras_sg_portrec_t, 1); + pr->port = port; pr->meas = sock->meas; pr->server = SIMIX_process_self(); pr->rdv = SIMIX_rdv_create(NULL); @@ -173,27 +220,31 @@ void gras_trp_sg_socket_server(gras_trp_plugin_t self, gras_socket_t sock) /* Create the socket */ data = xbt_new(s_gras_trp_sg_sock_data_t, 1); data->server = SIMIX_process_self(); + data->server_port = port; data->client = NULL; data->rdv_server = pr->rdv; data->rdv_client = NULL; - data->comm_recv = SIMIX_network_irecv(pr->rdv,NULL,0); + data->comm_recv = SIMIX_network_irecv(pr->rdv, NULL, 0); sock->data = data; - VERB10("'%s' (%d) ears on %s:%d%s (%p; data:%p); Here rdv: %p; Remote rdv: %p; Comm %p", - SIMIX_process_get_name(SIMIX_process_self()), gras_os_getpid(), - SIMIX_host_get_name(SIMIX_host_self()), sock->port, - sock->meas ? " (mode meas)" : "", sock,data, - (data->server==SIMIX_process_self())?data->rdv_server:data->rdv_client, - (data->server==SIMIX_process_self())?data->rdv_client:data->rdv_server, - data->comm_recv); + VERB10 + ("'%s' (%d) ears on %s:%d%s (%p; data:%p); Here rdv: %p; Remote rdv: %p; Comm %p", + SIMIX_process_get_name(SIMIX_process_self()), gras_os_getpid(), + SIMIX_host_get_name(SIMIX_host_self()), port, + sock->meas ? " (mode meas)" : "", sock, data, + (data->server == + SIMIX_process_self())? data->rdv_server : data->rdv_client, + (data->server == + SIMIX_process_self())? data->rdv_client : data->rdv_server, + data->comm_recv); } void gras_trp_sg_socket_close(gras_socket_t sock) { gras_hostdata_t *hd = - (gras_hostdata_t *) SIMIX_host_get_data(SIMIX_host_self()); + (gras_hostdata_t *) SIMIX_host_get_data(SIMIX_host_self()); unsigned int cpt; gras_sg_portrec_t pr; @@ -204,23 +255,25 @@ void gras_trp_sg_socket_close(gras_socket_t sock) xbt_assert0(hd, "Please run gras_process_init on each process"); - if (sock->data) { - /* FIXME: kill the rdv point if receiver side */ - free(sock->data); - } + gras_trp_sg_sock_data_t sockdata = sock->data; - if (sock->incoming && !sock->outgoing && sock->port >= 0) { + if (sock->incoming && !sock->outgoing && sockdata->server_port >= 0) { /* server mode socket. Unregister it from 'OS' tables */ xbt_dynar_foreach(hd->ports, cpt, pr) { DEBUG2("Check pr %d of %lu", cpt, xbt_dynar_length(hd->ports)); - if (pr->port == sock->port) { + if (pr->port == sockdata->server_port) { xbt_dynar_cursor_rm(hd->ports, &cpt); XBT_OUT; return; } } - WARN2("socket_close called on the unknown incoming socket %p (port=%d)", - sock, sock->port); + WARN2 + ("socket_close called on the unknown incoming socket %p (port=%d)", + sock, sockdata->server_port); + } + if (sock->data) { + /* FIXME: kill the rdv point if receiver side */ + free(sock->data); } XBT_OUT; } @@ -257,13 +310,11 @@ void gras_trp_sg_chunk_send_raw(gras_socket_t sock, /* creates simix action and waits its ends, waits in the sender host condition */ - if (XBT_LOG_ISENABLED(gras_trp_sg,xbt_log_priority_debug)) { - smx_process_t remote_dude = (sock_data->server==SIMIX_process_self())?(sock_data->client):(sock_data->server); + if (XBT_LOG_ISENABLED(gras_trp_sg, xbt_log_priority_debug)) { + smx_process_t remote_dude = + (sock_data->server == + SIMIX_process_self())? (sock_data->client) : (sock_data->server); smx_host_t remote_host = SIMIX_process_get_host(remote_dude); - DEBUG4("send chunk from %s to %s:%d (size=%ld)", - SIMIX_host_get_name(SIMIX_host_self()), - SIMIX_host_get_name(remote_host), - sock->peer_port, size); } //SIMIX_network_send(sock_data->rdv,size,1,-1,NULL,0,NULL,NULL); THROW_UNIMPLEMENTED; @@ -282,9 +333,9 @@ int gras_trp_sg_chunk_recv(gras_socket_t sock, gras_socket_t remote_socket = NULL; gras_msg_t msg_got; gras_msg_procdata_t msg_procdata = - (gras_msg_procdata_t) gras_libdata_by_name("gras_msg"); + (gras_msg_procdata_t) gras_libdata_by_name("gras_msg"); gras_trp_procdata_t trp_proc = - (gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id); + (gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id); xbt_assert0(sock->meas, "SG chunk exchange shouldn't be used on non-measurement sockets");