X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/16fdb8c65ac8d5baebc0278c499546c5fb10207b..510ceeffe379c276a6af4844c2724f960650167f:/src/gras/Msg/sg_msg.c diff --git a/src/gras/Msg/sg_msg.c b/src/gras/Msg/sg_msg.c index 93a9ae18d3..bd0e50c533 100644 --- a/src/gras/Msg/sg_msg.c +++ b/src/gras/Msg/sg_msg.c @@ -17,8 +17,12 @@ #include "gras/Transport/transport_interface.h" /* gras_trp_chunk_send/recv */ #include "gras/Transport/transport_private.h" /* sock->data */ +XBT_LOG_EXTERNAL_CATEGORY(gras_msg); +XBT_LOG_DEFAULT_CATEGORY(gras_msg); + void gras_msg_send_ext(gras_socket_t sock, e_gras_msg_kind_t kind, + unsigned long int ID, gras_msgtype_t msgtype, void *payload) { @@ -27,26 +31,61 @@ void gras_msg_send_ext(gras_socket_t sock, gras_msg_t msg; 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 */ + char *name; xbt_assert1(!gras_socket_is_meas(sock), "Asked to send a message on the measurement socket %p", sock); msg=xbt_new0(s_gras_msg_t,1); msg->type=msgtype; - + msg->ID = ID; - msg->payl_size=gras_datadesc_size(msgtype->ctn_type); - msg->payl=xbt_malloc(msg->payl_size); - if (msgtype->ctn_type) - whole_payload_size = gras_datadesc_copy(msgtype->ctn_type,payload,msg->payl); + if (kind == e_gras_msg_kind_rpcerror) { + /* error on remote host, carfull, payload is an exception */ + msg->payl_size=gras_datadesc_size(gras_datadesc_by_name("ex_t")); + msg->payl=xbt_malloc(msg->payl_size); + whole_payload_size = gras_datadesc_copy(gras_datadesc_by_name("ex_t"), + payload,msg->payl); + } else if (kind == e_gras_msg_kind_rpcanswer) { + msg->payl_size=gras_datadesc_size(msgtype->answer_type); + msg->payl=xbt_malloc(msg->payl_size); + if (msgtype->answer_type) + whole_payload_size = gras_datadesc_copy(msgtype->answer_type, + payload, msg->payl); + } else { + msg->payl_size=gras_datadesc_size(msgtype->ctn_type); + msg->payl=msg->payl_size?xbt_malloc(msg->payl_size):NULL; + if (msgtype->ctn_type) + whole_payload_size = gras_datadesc_copy(msgtype->ctn_type, + payload, msg->payl); + } + msg->kind = kind; - task=MSG_task_create(msgtype->name,0, - ((double)whole_payload_size)/(1024.0*1024.0),msg); + if (XBT_LOG_ISENABLED(gras_msg,xbt_log_priority_verbose)) { + asprintf(&name,"type:'%s';kind:'%s';ID %lu from %s:%d to %s:%d", + msg->type->name, e_gras_msg_kind_names[msg->kind], msg->ID, + gras_os_myname(),gras_os_myport(), + gras_socket_peer_name(sock), gras_socket_peer_port(sock)); + task=MSG_task_create(name,0, + ((double)whole_payload_size),msg); + free(name); + } else { + task=MSG_task_create(msg->type->name,0, + ((double)whole_payload_size),msg); + } + + DEBUG1("Prepare to send a message to %s", + MSG_host_get_name (sock_data->to_host)); if (MSG_task_put(task, sock_data->to_host,sock_data->to_chan) != MSG_OK) THROW0(system_error,0,"Problem during the MSG_task_put"); + VERB5("Sent to %s(%d) a message type '%s' kind '%s' ID %lu", + MSG_host_get_name(sock_data->to_host),sock_data->to_PID, + msg->type->name, + e_gras_msg_kind_names[msg->kind], + msg->ID); } /* * receive the next message on the given socket. @@ -64,15 +103,22 @@ gras_msg_recv(gras_socket_t sock, xbt_assert0(msg,"msg is an out parameter of gras_msg_recv..."); + if (MSG_task_get(&task, pd->chan) != MSG_OK) THROW0(system_error,0,"Error in MSG_task_get()"); msg_got=MSG_task_get_data(task); + msg_got->expe= msg->expe; memcpy(msg,msg_got,sizeof(s_gras_msg_t)); free(msg_got); if (MSG_task_destroy(task) != MSG_OK) THROW0(system_error,0,"Error in MSG_task_destroy()"); + + VERB3("Received a message type '%s' kind '%s' ID %lu",// from %s", + msg->type->name, + e_gras_msg_kind_names[msg->kind], + msg->ID); }