-/*
- * receive the next message on the given socket.
- */
-void
-gras_msg_recv(gras_socket_t sock,
- gras_msg_t msg) {
-
- gras_trp_sg_sock_data_t *sock_data;
- gras_trp_sg_sock_data_t *remote_sock_data;
- gras_hostdata_t *remote_hd;
- gras_msg_t msg_got;
- gras_msg_procdata_t msg_procdata = (gras_msg_procdata_t)gras_libdata_by_name("gras_msg");
-
- xbt_assert1(!gras_socket_is_meas(sock),
- "Asked to receive a message on the measurement socket %p", sock);
-
- xbt_assert0(msg,"msg is an out parameter of gras_msg_recv...");
-
- sock_data = (gras_trp_sg_sock_data_t *)sock->data;
- remote_sock_data = ((gras_trp_sg_sock_data_t *)sock->data)->to_socket->data;
- DEBUG3("Remote host %s, Remote Port: %d Local port %d", SIMIX_host_get_name(sock_data->to_host), sock->peer_port, sock->port);
- remote_hd = (gras_hostdata_t *)SIMIX_host_get_data(sock_data->to_host);
-
- if (xbt_fifo_size(msg_procdata->msg_to_receive_queue) == 0 ) {
- THROW_IMPOSSIBLE;
- }
- DEBUG1("Size msg_to_receive buffer: %d", xbt_fifo_size(msg_procdata->msg_to_receive_queue));
- msg_got = xbt_fifo_shift(msg_procdata->msg_to_receive_queue);
-
- SIMIX_mutex_lock(remote_sock_data->mutex);
-/* ok, I'm here, you can continuate the communication */
- SIMIX_cond_signal(remote_sock_data->cond);
-
-/* wait for communication end */
- SIMIX_cond_wait(remote_sock_data->cond,remote_sock_data->mutex);
-
- msg_got->expe= msg->expe;
- memcpy(msg,msg_got,sizeof(s_gras_msg_t));
- xbt_free(msg_got);
- SIMIX_mutex_unlock(remote_sock_data->mutex);
-
- VERB3("Received a message type '%s' kind '%s' ID %lu",// from %s",
- msg->type->name,
- e_gras_msg_kind_names[msg->kind],
- msg->ID);
+
+
+void gras_msg_send_ext(xbt_socket_t sock,
+ e_gras_msg_kind_t kind,
+ unsigned long int ID,
+ gras_msgtype_t msgtype, void *payload)
+{
+ int whole_payload_size = 0; /* msg->payload_size is used to memcpy the payload.
+ This is used to report the load onto the simulator. It also counts the size of pointed stuff */
+ gras_msg_t msg; /* message to send */
+ smx_action_t comm;
+ gras_trp_sg_sock_data_t sock_data = (gras_trp_sg_sock_data_t) sock->data;
+
+ smx_rdv_t target_rdv =
+ (sock_data->server == SIMIX_process_self())?
+ sock_data->rdv_client :
+ sock_data->rdv_server;
+
+ /*initialize gras message */
+ msg = xbt_new(s_gras_msg_t, 1);
+ sock->refcount++;
+ msg->expe = sock;
+ msg->kind = kind;
+ msg->type = msgtype;
+ msg->ID = ID;
+ XBT_PUBLIC(xbt_datadesc_type_t) xbt_datadesc_by_id(long int code);
+
+ /* to debug */
+ XBT_PUBLIC(void) xbt_datadesc_type_dump(const xbt_datadesc_type_t ddt);
+ XBT_PUBLIC(const char *) xbt_datadesc_arch_name(int code);
+
+ /* compare two data type description */
+ XBT_PUBLIC(int)
+ xbt_datadesc_type_cmp(const xbt_datadesc_type_t d1,
+ const xbt_datadesc_type_t d2);
+
+ /* Access function */
+ XBT_PUBLIC(int) xbt_datadesc_size(xbt_datadesc_type_t type);
+ /* Described data exchanges: direct use */
+ XBT_PUBLIC(int) xbt_datadesc_memcpy(xbt_datadesc_type_t type, void *src,
+ void *dst);
+ XBT_PUBLIC(void) xbt_datadesc_send(xbt_socket_t sock,
+ xbt_datadesc_type_t type, void *src);
+ XBT_PUBLIC(void) xbt_datadesc_recv(xbt_socket_t sock,
+ xbt_datadesc_type_t type, int r_arch,
+ void *dst);
+
+ /* Described data exchanges: IDL compilation FIXME: not implemented*/
+ void xbt_datadesc_gen_cpy(xbt_datadesc_type_t type, void *src,
+ void **dst);
+ void xbt_datadesc_gen_send(xbt_socket_t sock,
+ xbt_datadesc_type_t type, void *src);
+ void xbt_datadesc_gen_recv(xbt_socket_t sock,
+ xbt_datadesc_type_t type, int r_arch,
+ void *dst);
+
+
+ XBT_VERB("Send msg %s (%s) to rdv %p sock %p",
+ msgtype->name, e_gras_msg_kind_names[kind], target_rdv, sock);
+
+ if (kind == e_gras_msg_kind_rpcerror) {
+ /* error on remote host, careful, payload is an exception */
+ msg->payl_size = xbt_datadesc_size(xbt_datadesc_by_name("ex_t"));
+ msg->payl = xbt_malloc(msg->payl_size);
+ whole_payload_size =
+ xbt_datadesc_memcpy(xbt_datadesc_by_name("ex_t"), payload,
+ msg->payl);
+ } else if (kind == e_gras_msg_kind_rpcanswer) {
+ msg->payl_size = xbt_datadesc_size(msgtype->answer_type);
+ if (msg->payl_size)
+ msg->payl = xbt_malloc(msg->payl_size);
+ else
+ msg->payl = NULL;
+
+ if (msgtype->answer_type)
+ whole_payload_size = xbt_datadesc_memcpy(msgtype->answer_type,
+ payload, msg->payl);
+ } else {
+ msg->payl_size = xbt_datadesc_size(msgtype->ctn_type);
+ msg->payl = msg->payl_size ? xbt_malloc(msg->payl_size) : NULL;
+ if (msgtype->ctn_type)
+ whole_payload_size = xbt_datadesc_memcpy(msgtype->ctn_type,
+ payload, msg->payl);
+ }
+
+ comm = simcall_comm_isend(target_rdv, whole_payload_size, -1, msg, sizeof(void *), NULL,NULL, msg, 0);
+ simcall_comm_wait(comm, -1);
+
+ XBT_VERB("Message sent (and received)");
+