Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Partial fix of GRAS: gras-ping-sg now works again
authormquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Fri, 12 Nov 2010 20:22:54 +0000 (20:22 +0000)
committermquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Fri, 12 Nov 2010 20:22:54 +0000 (20:22 +0000)
* Make the following function specific to the plugins:
  - gras_socket_my_port(sock)
  - gras_socket_peer_port(sock)
  - gras_socket_peer_name(sock)
  - gras_socket_peer_proc(sock)
  - gras_socket_peer_proc_set(sock,peer_proc)
* In SG plugin, implement them properly knowing that the same socket
  object gets shared between peers
* In TCP plugin, use the previous behavior
* In file plugin, use THROW_UNIMPLEMENTED

git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@8545 48e7efb5-ca39-0410-a469-dd3cf9ba447f

include/gras/transport.h
src/gras/Transport/transport.c
src/gras/Transport/transport_interface.h
src/gras/Transport/transport_plugin_file.c
src/gras/Transport/transport_plugin_sg.c
src/gras/Transport/transport_plugin_tcp.c
src/gras/Transport/transport_private.h
src/gras/Virtu/virtu_sg.h

index 8479a8b..0f8f868 100644 (file)
@@ -82,9 +82,9 @@ XBT_PUBLIC(int) gras_socket_my_port(gras_socket_t sock);
 
 XBT_PUBLIC(int) gras_socket_peer_port(gras_socket_t sock);
 /** Get the host name of the remote side */
 
 XBT_PUBLIC(int) gras_socket_peer_port(gras_socket_t sock);
 /** Get the host name of the remote side */
-XBT_PUBLIC(char *) gras_socket_peer_name(gras_socket_t sock);
+XBT_PUBLIC(const char *) gras_socket_peer_name(gras_socket_t sock);
 /** Get the process name of the remote side */
 /** Get the process name of the remote side */
-XBT_PUBLIC(char *) gras_socket_peer_proc(gras_socket_t sock);
+XBT_PUBLIC(const char *) gras_socket_peer_proc(gras_socket_t sock);
 /* @}*/
 
 /** \defgroup GRAS_sock_meas Using measurement sockets
 /* @}*/
 
 /** \defgroup GRAS_sock_meas Using measurement sockets
index ed3f43e..cefc3e9 100644 (file)
@@ -163,10 +163,6 @@ void gras_trp_socket_new(int incoming, gras_socket_t * dst)
   sock->moredata = 0;
 
   sock->sd = -1;
   sock->moredata = 0;
 
   sock->sd = -1;
-  sock->port = -1;
-  sock->peer_port = -1;
-  sock->peer_name = NULL;
-  sock->peer_proc = NULL;
 
   sock->data = NULL;
   sock->bufdata = NULL;
 
   sock->data = NULL;
   sock->bufdata = NULL;
@@ -200,14 +196,13 @@ gras_socket_server_ext(unsigned short port,
   /* defaults settings */
   gras_trp_socket_new(1, &sock);
   sock->plugin = trp;
   /* 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);
   TRY {
   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);
   TRY {
-    trp->socket_server(trp, sock);
+    trp->socket_server(trp, port, sock);
     DEBUG3("in=%c out=%c accept=%c",
            sock->incoming ? 'y' : 'n',
            sock->outgoing ? 'y' : 'n', sock->accepting ? 'y' : 'n');
     DEBUG3("in=%c out=%c accept=%c",
            sock->incoming ? 'y' : 'n',
            sock->outgoing ? 'y' : 'n', sock->accepting ? 'y' : 'n');
@@ -288,14 +283,12 @@ gras_socket_client_ext(const char *host,
   /* defaults settings */
   gras_trp_socket_new(0, &sock);
   sock->plugin = trp;
   /* 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 {
   sock->buf_size = buf_size > 0 ? buf_size : 32 * 1024;
   sock->meas = measurement;
 
   /* plugin-specific */
   TRY {
-    (*trp->socket_client) (trp, sock);
+    (*trp->socket_client) (trp,host,port,sock);
     DEBUG3("in=%c out=%c accept=%c",
            sock->incoming ? 'y' : 'n',
            sock->outgoing ? 'y' : 'n', sock->accepting ? 'y' : 'n');
     DEBUG3("in=%c out=%c accept=%c",
            sock->incoming ? 'y' : 'n',
            sock->outgoing ? 'y' : 'n', sock->accepting ? 'y' : 'n');
@@ -376,8 +369,6 @@ void gras_socket_close(gras_socket_t sock)
           (*sock->plugin->socket_close) (sock);
 
         /* free the memory */
           (*sock->plugin->socket_close) (sock);
 
         /* free the memory */
-        if (sock->peer_name)
-          free(sock->peer_name);
         free(sock);
         XBT_OUT;
         return;
         free(sock);
         XBT_OUT;
         return;
@@ -432,27 +423,32 @@ gras_trp_plugin_t gras_trp_plugin_get_by_name(const char *name)
 
 int gras_socket_my_port(gras_socket_t sock)
 {
 
 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)
 {
 }
 
 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;
+  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)
 {
 }
 
 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) */
 }
 
 /** \brief Check if the provided socket is a measurement one (or a regular one) */
index 49223a4..d59cef1 100644 (file)
@@ -51,11 +51,18 @@ struct gras_trp_plugin_ {
   /* dst pointers are created and initialized with default values
      before call to socket_client/server. 
      Retrive the info you need from there. */
   /* dst pointers are created and initialized with default values
      before call to socket_client/server. 
      Retrive the info you need from there. */
-  void (*socket_client) (gras_trp_plugin_t self, gras_socket_t dst);
-  void (*socket_server) (gras_trp_plugin_t self, gras_socket_t dst);
+  void (*socket_client) (gras_trp_plugin_t self,const char *host,int port, gras_socket_t dst);
+  void (*socket_server) (gras_trp_plugin_t self, int port,gras_socket_t dst);
 
   gras_socket_t(*socket_accept) (gras_socket_t from);
 
 
   gras_socket_t(*socket_accept) (gras_socket_t from);
 
+  /* Getting info about who's speaking */
+  int (*my_port)(gras_socket_t sd);
+  int (*peer_port)(gras_socket_t sd);
+  const char* (*peer_name)(gras_socket_t sd);
+  const char* (*peer_proc)(gras_socket_t sd);
+  void (*peer_proc_set)(gras_socket_t sd,char*peer_proc);
+
 
   /* socket_close() is responsible of telling the OS that the socket is over,
      but should not free the socket itself (beside the specific part) */
 
   /* socket_close() is responsible of telling the OS that the socket is over,
      but should not free the socket itself (beside the specific part) */
index 64859a5..4139999 100644 (file)
@@ -40,7 +40,24 @@ typedef struct {
  *** Specific socket part
  ***/
 
  *** Specific socket part
  ***/
 
-
+/***
+ *** Info about who's speaking
+ ***/
+static int gras_trp_file_my_port(gras_socket_t s) {
+  THROW_UNIMPLEMENTED;
+}
+static int gras_trp_file_peer_port(gras_socket_t s) {
+  THROW_UNIMPLEMENTED;
+}
+static char* gras_trp_file_peer_name(gras_socket_t s) {
+  THROW_UNIMPLEMENTED;
+}
+static char* gras_trp_file_peer_proc(gras_socket_t s) {
+  THROW_UNIMPLEMENTED;
+}
+static void gras_trp_file_peer_proc_set(gras_socket_t s,char *name) {
+  THROW_UNIMPLEMENTED;
+}
 
 /***
  *** Code
 
 /***
  *** Code
@@ -52,6 +69,12 @@ void gras_trp_file_setup(gras_trp_plugin_t plug)
 
   FD_ZERO(&(file->incoming_socks));
 
 
   FD_ZERO(&(file->incoming_socks));
 
+  plug->my_port = gras_trp_file_my_port;
+  plug->peer_port = gras_trp_file_peer_port;
+  plug->peer_name = gras_trp_file_peer_name;
+  plug->peer_proc = gras_trp_file_peer_proc;
+  plug->peer_proc_set = gras_trp_file_peer_proc_set;
+
   plug->socket_close = gras_trp_file_close;
 
   plug->raw_send = gras_trp_file_chunk_send_raw;
   plug->socket_close = gras_trp_file_close;
 
   plug->raw_send = gras_trp_file_chunk_send_raw;
index 739a2a3..57c12c3 100644 (file)
@@ -12,6 +12,7 @@
 
 #include "xbt/ex.h"
 
 
 #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"
 #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,
 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,
                                /* 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);
 
                                /* 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;
 }
 
   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)
 {
 
 
 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;
   gras_trp_sg_plug_data_t *data = xbt_new(gras_trp_sg_plug_data_t, 1);
 
   plug->data = data;
@@ -86,6 +126,8 @@ void gras_trp_sg_setup(gras_trp_plugin_t plug)
 }
 
 void gras_trp_sg_socket_client(gras_trp_plugin_t self,
 }
 
 void gras_trp_sg_socket_client(gras_trp_plugin_t self,
+                               const char*host,
+                               int port,
                                /* OUT */ gras_socket_t sock)
 {
 
                                /* OUT */ gras_socket_t sock)
 {
 
@@ -95,41 +137,42 @@ void gras_trp_sg_socket_client(gras_trp_plugin_t self,
   gras_sg_portrec_t pr;
 
   /* make sure this socket will reach someone */
   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,
     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",
 
   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);
+           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",
 
   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);
+           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 "
   }
 
   /* 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 "
   }
   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;
   }
 
   /* 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;
 
   /* initialize synchronization stuff on the socket */
   data->rdv_server = pr->rdv;
@@ -142,11 +185,11 @@ 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(),
 
   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 *hd =
@@ -159,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 */
   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.",
 
   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);
 
   /* This port is free, let's take it */
   pr = xbt_new(s_gras_sg_portrec_t, 1);
-  pr->port = sock->port;
+  pr->port = port;
   pr->meas = sock->meas;
   pr->server = SIMIX_process_self();
   pr->rdv = SIMIX_rdv_create(NULL);
   pr->meas = sock->meas;
   pr->server = SIMIX_process_self();
   pr->rdv = SIMIX_rdv_create(NULL);
@@ -177,6 +220,7 @@ 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();
   /* 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->client = NULL;
   data->rdv_server = pr->rdv;
   data->rdv_client = NULL;
@@ -187,7 +231,7 @@ void gras_trp_sg_socket_server(gras_trp_plugin_t self, gras_socket_t sock)
   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(),
   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,
+       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,
        sock->meas ? " (mode meas)" : "", sock, data,
        (data->server ==
         SIMIX_process_self())? data->rdv_server : data->rdv_client,
@@ -211,16 +255,13 @@ void gras_trp_sg_socket_close(gras_socket_t sock)
 
   xbt_assert0(hd, "Please run gras_process_init on each process");
 
 
   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));
     /* 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;
         xbt_dynar_cursor_rm(hd->ports, &cpt);
         XBT_OUT;
         return;
@@ -228,7 +269,11 @@ void gras_trp_sg_socket_close(gras_socket_t sock)
     }
     WARN2
         ("socket_close called on the unknown incoming socket %p (port=%d)",
     }
     WARN2
         ("socket_close called on the unknown incoming socket %p (port=%d)",
-         sock, sock->port);
+         sock, sockdata->server_port);
+  }
+  if (sock->data) {
+    /* FIXME: kill the rdv point if receiver side */
+    free(sock->data);
   }
   XBT_OUT;
 }
   }
   XBT_OUT;
 }
@@ -270,9 +315,6 @@ void gras_trp_sg_chunk_send_raw(gras_socket_t sock,
         (sock_data->server ==
          SIMIX_process_self())? (sock_data->client) : (sock_data->server);
     smx_host_t remote_host = SIMIX_process_get_host(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;
   }
   //SIMIX_network_send(sock_data->rdv,size,1,-1,NULL,0,NULL,NULL);
   THROW_UNIMPLEMENTED;
index ce5923d..6c22cb7 100644 (file)
@@ -34,6 +34,13 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_trp_tcp, gras_trp,
  *** Specific socket part
  ***/
 
  *** Specific socket part
  ***/
 
+typedef struct {
+  int port;                     /* port on this side */
+  int peer_port;                /* port on the other side */
+  char *peer_name;              /* hostname of the other side */
+  char *peer_proc;              /* process on the other side */
+} s_gras_trp_tcp_sock_data_t, *gras_trp_tcp_sock_data_t;
+
 typedef enum { buffering_buf, buffering_iov } buffering_kind;
 
 typedef struct {
 typedef enum { buffering_buf, buffering_iov } buffering_kind;
 
 typedef struct {
@@ -72,10 +79,18 @@ static int gras_trp_tcp_recv(gras_socket_t sock, char *data,
 
 static int _gras_tcp_proto_number(void);
 
 
 static int _gras_tcp_proto_number(void);
 
-static XBT_INLINE void gras_trp_sock_socket_client(gras_trp_plugin_t
-                                                   ignored,
-                                                   gras_socket_t sock)
+static XBT_INLINE
+void gras_trp_sock_socket_client(gras_trp_plugin_t ignored,
+                                 const char *host,
+                                 int port,
+                                 /*OUT*/gras_socket_t sock)
 {
 {
+  gras_trp_tcp_sock_data_t sockdata = xbt_new(s_gras_trp_tcp_sock_data_t,1);
+  sockdata->port = port;
+  sockdata->peer_proc = NULL;
+  sockdata->peer_port = port;
+  sockdata->peer_name = (char *) strdup(host ? host : "localhost");
+  sock->data = sockdata;
 
   struct sockaddr_in addr;
   struct hostent *he;
 
   struct sockaddr_in addr;
   struct hostent *he;
@@ -102,10 +117,10 @@ static XBT_INLINE void gras_trp_sock_socket_client(gras_trp_plugin_t
           sock_errstr(sock_errno));
   }
 
           sock_errstr(sock_errno));
   }
 
-  he = gethostbyname(sock->peer_name);
+  he = gethostbyname(sockdata->peer_name);
   if (he == NULL) {
     THROW2(system_error, 0, "Failed to lookup hostname %s: %s",
   if (he == NULL) {
     THROW2(system_error, 0, "Failed to lookup hostname %s: %s",
-           sock->peer_name, sock_errstr(sock_errno));
+        sockdata->peer_name, sock_errstr(sock_errno));
   }
 
   haddr = ((struct in_addr *) (he->h_addr_list)[0]);
   }
 
   haddr = ((struct in_addr *) (he->h_addr_list)[0]);
@@ -113,20 +128,20 @@ static XBT_INLINE void gras_trp_sock_socket_client(gras_trp_plugin_t
   memset(&addr, 0, sizeof(struct sockaddr_in));
   memcpy(&addr.sin_addr, haddr, sizeof(struct in_addr));
   addr.sin_family = AF_INET;
   memset(&addr, 0, sizeof(struct sockaddr_in));
   memcpy(&addr.sin_addr, haddr, sizeof(struct in_addr));
   addr.sin_family = AF_INET;
-  addr.sin_port = htons(sock->peer_port);
+  addr.sin_port = htons(sockdata->peer_port);
 
   if (connect(sock->sd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
     tcp_close(sock->sd);
     THROW3(system_error, 0,
            "Failed to connect socket to %s:%d (%s)",
 
   if (connect(sock->sd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
     tcp_close(sock->sd);
     THROW3(system_error, 0,
            "Failed to connect socket to %s:%d (%s)",
-           sock->peer_name, sock->peer_port, sock_errstr(sock_errno));
+           sockdata->peer_name, sockdata->peer_port, sock_errstr(sock_errno));
   }
 
   gras_trp_tcp_send(sock, (char *) &myport, sizeof(uint32_t));
   }
 
   gras_trp_tcp_send(sock, (char *) &myport, sizeof(uint32_t));
-  DEBUG1("peerport sent to %d", sock->peer_port);
+  DEBUG1("peerport sent to %d", sockdata->peer_port);
 
   VERB4("Connect to %s:%d (sd=%d, port %d here)",
 
   VERB4("Connect to %s:%d (sd=%d, port %d here)",
-        sock->peer_name, sock->peer_port, sock->sd, sock->port);
+        sockdata->peer_name, sockdata->peer_port, sock->sd, sockdata->port);
 }
 
 /**
 }
 
 /**
@@ -134,17 +149,25 @@ static XBT_INLINE void gras_trp_sock_socket_client(gras_trp_plugin_t
  *
  * Open a socket used to receive messages.
  */
  *
  * Open a socket used to receive messages.
  */
-static XBT_INLINE void gras_trp_sock_socket_server(gras_trp_plugin_t
-                                                   ignored,
-                                                   gras_socket_t sock)
+static XBT_INLINE
+void gras_trp_sock_socket_server(gras_trp_plugin_t ignored,
+                                 int port,
+                                 gras_socket_t sock)
 {
   int size = sock->buf_size;
   int on = 1;
   struct sockaddr_in server;
 
 {
   int size = sock->buf_size;
   int on = 1;
   struct sockaddr_in server;
 
+  gras_trp_tcp_sock_data_t sockdata = xbt_new(s_gras_trp_tcp_sock_data_t,1);
+  sockdata->port = port;
+  sockdata->peer_port = -1;
+  sockdata->peer_name = NULL;
+  sockdata->peer_proc = NULL;
+  sock->data=sockdata;
+
   sock->outgoing = 1;           /* TCP => duplex mode */
 
   sock->outgoing = 1;           /* TCP => duplex mode */
 
-  server.sin_port = htons((u_short) sock->port);
+  server.sin_port = htons((u_short) sockdata->port);
   server.sin_addr.s_addr = INADDR_ANY;
   server.sin_family = AF_INET;
   if ((sock->sd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
   server.sin_addr.s_addr = INADDR_ANY;
   server.sin_family = AF_INET;
   if ((sock->sd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
@@ -168,19 +191,19 @@ static XBT_INLINE void gras_trp_sock_socket_server(gras_trp_plugin_t
   if (bind(sock->sd, (struct sockaddr *) &server, sizeof(server)) == -1) {
     tcp_close(sock->sd);
     THROW2(system_error, 0,
   if (bind(sock->sd, (struct sockaddr *) &server, sizeof(server)) == -1) {
     tcp_close(sock->sd);
     THROW2(system_error, 0,
-           "Cannot bind to port %d: %s", sock->port,
+           "Cannot bind to port %d: %s", sockdata->port,
            sock_errstr(sock_errno));
   }
 
            sock_errstr(sock_errno));
   }
 
-  DEBUG2("Listen on port %d (sd=%d)", sock->port, sock->sd);
+  DEBUG2("Listen on port %d (sd=%d)", sockdata->port, sock->sd);
   if (listen(sock->sd, 5) < 0) {
     tcp_close(sock->sd);
     THROW2(system_error, 0,
            "Cannot listen on port %d: %s",
   if (listen(sock->sd, 5) < 0) {
     tcp_close(sock->sd);
     THROW2(system_error, 0,
            "Cannot listen on port %d: %s",
-           sock->port, sock_errstr(sock_errno));
+           sockdata->port, sock_errstr(sock_errno));
   }
 
   }
 
-  VERB2("Openned a server socket on port %d (sd=%d)", sock->port,
+  VERB2("Openned a server socket on port %d (sd=%d)", sockdata->port,
         sock->sd);
 }
 
         sock->sd);
 }
 
@@ -233,15 +256,18 @@ static gras_socket_t gras_trp_sock_socket_accept(gras_socket_t sock)
   res->outgoing = sock->outgoing;
   res->accepting = 0;
   res->sd = sd;
   res->outgoing = sock->outgoing;
   res->accepting = 0;
   res->sd = sd;
-  res->port = -1;
+  gras_trp_tcp_sock_data_t sockdata = xbt_new(s_gras_trp_tcp_sock_data_t,1);
+  sockdata->port = -1;
+  res->data=sockdata;
+
 
   gras_trp_tcp_recv(res, (char *) &hisport, sizeof(hisport));
 
   gras_trp_tcp_recv(res, (char *) &hisport, sizeof(hisport));
-  res->peer_port = ntohl(hisport);
-  DEBUG1("peerport %d received", res->peer_port);
+  sockdata->peer_port = ntohl(hisport);
+  DEBUG1("peerport %d received", sockdata->peer_port);
 
   /* FIXME: Lock to protect inet_ntoa */
   if (((struct sockaddr *) &peer_in)->sa_family != AF_INET) {
 
   /* FIXME: Lock to protect inet_ntoa */
   if (((struct sockaddr *) &peer_in)->sa_family != AF_INET) {
-    res->peer_name = (char *) strdup("unknown");
+    sockdata->peer_name = (char *) strdup("unknown");
   } else {
     struct in_addr addrAsInAddr;
     char *tmp;
   } else {
     struct in_addr addrAsInAddr;
     char *tmp;
@@ -250,13 +276,13 @@ static gras_socket_t gras_trp_sock_socket_accept(gras_socket_t sock)
 
     tmp = inet_ntoa(addrAsInAddr);
     if (tmp != NULL) {
 
     tmp = inet_ntoa(addrAsInAddr);
     if (tmp != NULL) {
-      res->peer_name = (char *) strdup(tmp);
+      sockdata->peer_name = (char *) strdup(tmp);
     } else {
     } else {
-      res->peer_name = (char *) strdup("unknown");
+      sockdata->peer_name = (char *) strdup("unknown");
     }
   }
 
     }
   }
 
-  VERB3("Accepted from %s:%d (sd=%d)", res->peer_name, res->peer_port, sd);
+  VERB3("Accepted from %s:%d (sd=%d)", sockdata->peer_name, sockdata->peer_port, sd);
   xbt_dynar_push(((gras_trp_procdata_t)
                   gras_libdata_by_id(gras_trp_libdata_id))->sockets, &res);
 
   xbt_dynar_push(((gras_trp_procdata_t)
                   gras_libdata_by_id(gras_trp_libdata_id))->sockets, &res);
 
@@ -270,6 +296,10 @@ static void gras_trp_sock_socket_close(gras_socket_t sock)
   if (!sock)
     return;                     /* close only once */
 
   if (!sock)
     return;                     /* close only once */
 
+  if (((gras_trp_tcp_sock_data_t)sock->data)->peer_name)
+    free(((gras_trp_tcp_sock_data_t)sock->data)->peer_name);
+  free(sock->data);
+
   VERB1("close tcp connection %d", sock->sd);
 
   /* ask the listener to close the socket */
   VERB1("close tcp connection %d", sock->sd);
 
   /* ask the listener to close the socket */
@@ -584,8 +614,11 @@ gras_trp_iov_recv(gras_socket_t sock, char *chunk, unsigned long int size)
  ***/
 
 void gras_trp_buf_socket_client(gras_trp_plugin_t self,
  ***/
 
 void gras_trp_buf_socket_client(gras_trp_plugin_t self,
+    const char *host,
+    int port,
                                 gras_socket_t sock);
 void gras_trp_buf_socket_server(gras_trp_plugin_t self,
                                 gras_socket_t sock);
 void gras_trp_buf_socket_server(gras_trp_plugin_t self,
+                                int port,
                                 gras_socket_t sock);
 gras_socket_t gras_trp_buf_socket_accept(gras_socket_t sock);
 
                                 gras_socket_t sock);
 gras_socket_t gras_trp_buf_socket_accept(gras_socket_t sock);
 
@@ -621,12 +654,43 @@ gras_socket_t gras_trp_buf_init_sock(gras_socket_t sock)
   return sock;
 }
 
   return sock;
 }
 
+/***
+ *** Info about who's speaking
+ ***/
+static int gras_trp_tcp_my_port(gras_socket_t s) {
+  gras_trp_tcp_sock_data_t sockdata = s->data;
+  return sockdata->port;
+}
+static int gras_trp_tcp_peer_port(gras_socket_t s) {
+  gras_trp_tcp_sock_data_t sockdata = s->data;
+  return sockdata->peer_port;
+}
+static const char* gras_trp_tcp_peer_name(gras_socket_t s) {
+  gras_trp_tcp_sock_data_t sockdata = s->data;
+  return sockdata->peer_name;
+}
+static const char* gras_trp_tcp_peer_proc(gras_socket_t s) {
+  gras_trp_tcp_sock_data_t sockdata = s->data;
+  return sockdata->peer_proc;
+}
+static void gras_trp_tcp_peer_proc_set(gras_socket_t s,char *name) {
+  gras_trp_tcp_sock_data_t sockdata = s->data;
+  sockdata->peer_proc = xbt_strdup(name);
+}
+
 /***
  *** Code
  ***/
 void gras_trp_tcp_setup(gras_trp_plugin_t plug)
 {
 
 /***
  *** Code
  ***/
 void gras_trp_tcp_setup(gras_trp_plugin_t plug)
 {
 
+  plug->my_port = gras_trp_tcp_my_port;
+  plug->peer_port = gras_trp_tcp_peer_port;
+  plug->peer_name = gras_trp_tcp_peer_name;
+  plug->peer_proc = gras_trp_tcp_peer_proc;
+  plug->peer_proc_set = gras_trp_tcp_peer_proc_set;
+
+
   plug->socket_client = gras_trp_buf_socket_client;
   plug->socket_server = gras_trp_buf_socket_server;
   plug->socket_accept = gras_trp_buf_socket_accept;
   plug->socket_client = gras_trp_buf_socket_client;
   plug->socket_server = gras_trp_buf_socket_server;
   plug->socket_accept = gras_trp_buf_socket_accept;
@@ -649,10 +713,12 @@ void gras_trp_tcp_setup(gras_trp_plugin_t plug)
 }
 
 void gras_trp_buf_socket_client(gras_trp_plugin_t self,
 }
 
 void gras_trp_buf_socket_client(gras_trp_plugin_t self,
+    const char *host,
+    int port,
                                 /* OUT */ gras_socket_t sock)
 {
 
                                 /* OUT */ gras_socket_t sock)
 {
 
-  gras_trp_sock_socket_client(NULL, sock);
+  gras_trp_sock_socket_client(NULL, host,port,sock);
   gras_trp_buf_init_sock(sock);
 }
 
   gras_trp_buf_init_sock(sock);
 }
 
@@ -662,10 +728,11 @@ void gras_trp_buf_socket_client(gras_trp_plugin_t self,
  * Open a socket used to receive messages.
  */
 void gras_trp_buf_socket_server(gras_trp_plugin_t self,
  * Open a socket used to receive messages.
  */
 void gras_trp_buf_socket_server(gras_trp_plugin_t self,
+      int port,
                                 /* OUT */ gras_socket_t sock)
 {
 
                                 /* OUT */ gras_socket_t sock)
 {
 
-  gras_trp_sock_socket_server(NULL, sock);
+  gras_trp_sock_socket_server(NULL, port, sock);
   gras_trp_buf_init_sock(sock);
 }
 
   gras_trp_buf_init_sock(sock);
 }
 
index d886c04..ad0f55d 100644 (file)
@@ -74,10 +74,6 @@ typedef struct s_gras_socket {
                                    Field here to remember it when accepting */
 
   int sd;
                                    Field here to remember it when accepting */
 
   int sd;
-  int port;                     /* port on this side */
-  int peer_port;                /* port on the other side */
-  char *peer_name;              /* hostname of the other side */
-  char *peer_proc;              /* process on the other side */
 
   void *data;                   /* plugin specific data */
 
 
   void *data;                   /* plugin specific data */
 
index 16e4f00..0180b9a 100644 (file)
@@ -37,6 +37,9 @@ typedef struct {
   smx_rdv_t rdv_server;         /* The rendez-vous point to use */
   smx_rdv_t rdv_client;         /* The rendez-vous point to use */
   smx_comm_t comm_recv;         /* The comm of irecv on receiver side */
   smx_rdv_t rdv_server;         /* The rendez-vous point to use */
   smx_rdv_t rdv_client;         /* The rendez-vous point to use */
   smx_comm_t comm_recv;         /* The comm of irecv on receiver side */
+
+  int server_port;
+  int client_port;
 } s_gras_trp_sg_sock_data_t, *gras_trp_sg_sock_data_t;
 
 
 } s_gras_trp_sg_sock_data_t, *gras_trp_sg_sock_data_t;