+void gras_trp_sg_chunk_send_raw(gras_socket_t sock,
+ const char *data, unsigned long int size)
+{
+ char name[256];
+ static unsigned int count = 0;
+
+ smx_action_t act; /* simix action */
+ gras_trp_sg_sock_data_t *sock_data;
+ gras_trp_procdata_t trp_remote_proc;
+ gras_msg_procdata_t msg_remote_proc;
+ gras_msg_t msg; /* message to send */
+
+ sock_data = (gras_trp_sg_sock_data_t *) sock->data;
+
+ xbt_assert0(sock->meas,
+ "SG chunk exchange shouldn't be used on non-measurement sockets");
+
+ SIMIX_mutex_lock(sock_data->mutex);
+ sprintf(name, "Chunk[%d]", count++);
+ /*initialize gras message */
+ msg = xbt_new(s_gras_msg_t, 1);
+ msg->expe = sock;
+ msg->payl_size = size;
+
+ if (data) {
+ msg->payl = (void *) xbt_malloc(size);
+ memcpy(msg->payl, data, size);
+ } else {
+ msg->payl = NULL;
+ }
+
+
+ /* put his socket on the selectable socket queue */
+ trp_remote_proc = (gras_trp_procdata_t)
+ gras_libdata_by_name_from_remote("gras_trp", sock_data->to_process);
+ xbt_queue_push(trp_remote_proc->meas_selectable_sockets, &sock);
+
+ /* put message on msg_queue */
+ msg_remote_proc = (gras_msg_procdata_t)
+ gras_libdata_by_name_from_remote("gras_msg", sock_data->to_process);
+
+ xbt_fifo_push(msg_remote_proc->msg_to_receive_queue_meas, msg);
+
+ /* wait for the receiver */
+ SIMIX_cond_wait(sock_data->cond, sock_data->mutex);
+
+ /* creates simix action and waits its ends, waits in the sender host
+ condition */
+ DEBUG5("send chunk %s from %s to %s:%d (size=%ld)",
+ name, SIMIX_host_get_name(SIMIX_host_self()),
+ SIMIX_host_get_name(sock_data->to_host), sock->peer_port, size);
+
+ act = SIMIX_action_communicate(SIMIX_host_self(), sock_data->to_host,
+ name, size, -1);
+ SIMIX_register_action_to_condition(act, sock_data->cond);
+ SIMIX_cond_wait(sock_data->cond, sock_data->mutex);
+ SIMIX_unregister_action_to_condition(act, sock_data->cond);
+ /* error treatmeant (FIXME) */
+
+ /* cleanup structures */
+ SIMIX_action_destroy(act);
+
+ SIMIX_mutex_unlock(sock_data->mutex);