+
+ /* create simulation data of the socket */
+ data = xbt_new0(s_gras_trp_sg_sock_data_t, 1);
+ data->client = SIMIX_process_self();
+ data->server = pr->server;
+ data->server_port = port;
+ data->client_port = gras_os_myport();
+
+ /* initialize synchronization stuff on the socket */
+ data->rdv_server = pr->rdv;
+ data->rdv_client = SIMIX_req_rdv_create(NULL);
+ data->comm_recv = SIMIX_req_comm_irecv(data->rdv_client, &data->msg, NULL, NULL, NULL);
+
+ /* connect that simulation data to the socket */
+ sock->data = data;
+ sock->incoming = 1;
+
+ XBT_DEBUG("%s (PID %d) connects in %s mode to %s:%d (rdv_ser:%p, rdv_cli:%p, comm:%p)",
+ SIMIX_req_process_get_name(SIMIX_process_self()), gras_os_getpid(),
+ sock->meas ? "meas" : "regular", host, port,
+ data->rdv_server,data->rdv_client,data->comm_recv);
+}
+
+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_self_get_data();
+ gras_sg_portrec_t pr;
+ gras_trp_sg_sock_data_t data;
+
+ xbt_assert(hd, "Please run gras_process_init on each process");
+
+ sock->accepting = 1;
+
+ /* Check whether a server is already listening on that port or not */
+ pr = find_port(hd, port);
+
+ if (pr)
+ THROWF(mismatch_error, 0,
+ "can't listen on address %s:%d: port already in use.",
+ SIMIX_host_self_get_name(), port);
+
+ /* This port is free, let's take it */
+ pr = xbt_new(s_gras_sg_portrec_t, 1);
+ pr->port = port;
+ pr->meas = sock->meas;
+ pr->server = SIMIX_process_self();
+ xbt_dynar_push(hd->ports, &pr);
+ pr->rdv = SIMIX_req_rdv_create(NULL);