+void gras_trp_sg_socket_client(gras_trp_plugin_t self,
+ /* OUT */ gras_socket_t sock){
+ xbt_ex_t e;
+
+ smx_host_t peer;
+ gras_hostdata_t *hd;
+ gras_trp_sg_sock_data_t *data;
+ gras_sg_portrec_t pr;
+
+ /* make sure this socket will reach someone */
+ if (!(peer=SIMIX_host_get_by_name(sock->peer_name)))
+ THROW1(mismatch_error,0,
+ "Can't connect to %s: no such host.\n",sock->peer_name);
+
+ 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);
+
+ TRY {
+ find_port(hd,sock->peer_port,&pr);
+ } CATCH(e) {
+ if (e.category == mismatch_error) {
+ xbt_ex_free(e);
+ THROW2(mismatch_error,0,
+ "can't connect to %s:%d, no process listen on this port",
+ sock->peer_name,sock->peer_port);
+ }
+ RETHROW;
+ }
+
+ 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);
+ }
+ 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);
+ }
+ /* create the socket */
+ data = xbt_new(gras_trp_sg_sock_data_t,1);
+ data->from_process = SIMIX_process_self();
+ data->to_process = pr.process;
+ data->to_host = peer;
+
+ /* initialize mutex and condition of the socket */
+ data->mutex = SIMIX_mutex_init();
+ data->cond = SIMIX_cond_init();
+ data->to_socket = pr.socket;
+
+ sock->data = data;
+ sock->incoming = 1;
+
+ 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);