+int gras_trp_sg_chunk_recv(gras_socket_t sock,
+ char *data, unsigned long int size)
+{
+ gras_trp_sg_sock_data_t *sock_data;
+ gras_trp_sg_sock_data_t *remote_sock_data;
+ 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_trp_procdata_t trp_proc =
+ (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");
+ xbt_queue_shift_timed(trp_proc->meas_selectable_sockets,
+ &remote_socket, 60);
+
+ if (remote_socket == NULL) {
+ THROW0(timeout_error, 0, "Timeout");
+ }
+
+ remote_sock_data = (gras_trp_sg_sock_data_t *) remote_socket->data;
+ msg_got = xbt_fifo_shift(msg_procdata->msg_to_receive_queue_meas);
+
+ sock_data = (gras_trp_sg_sock_data_t *) sock->data;
+
+ /* ok, I'm here, you can continue the communication */
+ SIMIX_cond_signal(remote_sock_data->cond);
+
+ SIMIX_mutex_lock(remote_sock_data->mutex);
+ /* wait for communication end */
+ SIMIX_cond_wait(remote_sock_data->cond, remote_sock_data->mutex);
+
+ if (msg_got->payl_size != size)
+ THROW5(mismatch_error, 0,
+ "Got %d bytes when %ld where expected (in %s->%s:%d)",
+ msg_got->payl_size, size,
+ SIMIX_host_get_name(sock_data->to_host),
+ SIMIX_host_get_name(SIMIX_host_self()), sock->peer_port);
+
+ if (data)
+ memcpy(data, msg_got->payl, size);
+
+ if (msg_got->payl)
+ xbt_free(msg_got->payl);
+
+ xbt_free(msg_got);
+ SIMIX_mutex_unlock(remote_sock_data->mutex);
+ return 0;
+}