X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/cc37ec913eb0e9d729dd3107e3f39e4a1050c921..31b7fa457f9267af8eda2eee06aae74dd78eb412:/src/gras/Msg/sg_msg.c diff --git a/src/gras/Msg/sg_msg.c b/src/gras/Msg/sg_msg.c index fc1b66d695..06bebc5ca7 100644 --- a/src/gras/Msg/sg_msg.c +++ b/src/gras/Msg/sg_msg.c @@ -19,6 +19,80 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(gras_msg); typedef void *gras_trp_bufdata_; +#include "simix/datatypes.h" +#include "simix/private.h" + +/* Yeah, the following is awfull, breaking the encapsulation of at least 3 modules + * at the same time, but I'm tracking this bug since too long now, I want it dead. now. + * Sorry, Mt. + */ +typedef struct { + xbt_thread_t listener; +} *fake_gras_msg_listener_t; +typedef struct { + smx_process_t s_process; +} *fake_xbt_thread_t; + +int gras_socket_im_the_server(gras_socket_t sock) { + gras_trp_sg_sock_data_t sock_data = sock->data; + gras_procdata_t* pd; + gras_msg_listener_t l; + xbt_thread_t listener_thread; + smx_process_t server_listener_process=NULL; + smx_process_t client_listener_process = NULL; + + VERB4("Am I the server of socket %p (client = %p, server = %p) ? process self: %p", sock, sock_data->client, sock_data->server, SIMIX_process_self()); + + if (sock_data->server == SIMIX_process_self()) { + VERB0("I am the server"); + return 1; + } + if (sock_data->client == SIMIX_process_self()) { + VERB0("I am the client"); + return 0; + } + VERB0("I am neither the client nor the server, probably a listener"); + + /* neither the client nor the server. Check their respective listeners */ + pd = ((gras_procdata_t*)SIMIX_process_get_data(sock_data->server)); + l = pd->listener; + if (l) { + listener_thread = ((fake_gras_msg_listener_t)l)->listener; + server_listener_process = ((fake_xbt_thread_t)listener_thread)->s_process; + if (server_listener_process == SIMIX_process_self()) { + VERB0("I am the listener of the server"); + return 1; + } + } + + if (sock_data->client) { + pd = ((gras_procdata_t*)SIMIX_process_get_data(sock_data->client)); + l = pd->listener; + if (l) { + listener_thread = ((fake_gras_msg_listener_t)l)->listener; + client_listener_process = ((fake_xbt_thread_t)listener_thread)->s_process; + if (client_listener_process == SIMIX_process_self()) { + VERB0("I am the listener of the client"); + return 0; + } + } + } + /* THAT'S BAD! I should be either client or server of the sockets I get messages on!! */ + /* This is where the bug is visible. Try to die as loudly as possible */ + xbt_backtrace_display_current(); + ((char*)sock)[sizeof(*sock)+1] = '0'; /* Try to make valgrind angry to see where that damn socket comes from */ + if(system(bprintf("cat /proc/%d/maps 1>&2",getpid()))){} + INFO6("I'm not the client in socket %p (comm:%p, rdvser=%p, rdvcli=%p) to %s, that's %s", + sock,sock_data->comm_recv,sock_data->rdv_server,sock_data->rdv_client, + SIMIX_host_get_name(SIMIX_process_get_host(sock_data->server)), + sock_data->client?SIMIX_host_get_name(SIMIX_process_get_host(sock_data->client)):"(no client)"); + INFO7("server:%s (%p) server_listener=%p client:%s (%p) client_listener=%p, I'm %p", + SIMIX_host_get_name(SIMIX_process_get_host(sock_data->server)), sock_data->server,server_listener_process, + sock_data->client?SIMIX_host_get_name(SIMIX_process_get_host(sock_data->client)):"(no client)", sock_data->client,client_listener_process, + SIMIX_process_self()); + xbt_die("Bailing out after finding that damn bug"); + +} gras_msg_t gras_msg_recv_any(void) { @@ -26,10 +100,10 @@ gras_msg_t gras_msg_recv_any(void) (gras_trp_procdata_t) gras_libdata_by_name("gras_trp"); gras_msg_t msg; /* Build a dynar of all communications I could get something from */ - xbt_dynar_t comms = xbt_dynar_new(sizeof(smx_comm_t), NULL); + xbt_dynar_t comms = xbt_dynar_new(sizeof(smx_action_t), NULL); unsigned int cursor = 0; int got = 0; - smx_comm_t comm = NULL; + smx_action_t comm = NULL; gras_socket_t sock = NULL; gras_trp_sg_sock_data_t sock_data; xbt_dynar_foreach(trp_proc->sockets, cursor, sock) { @@ -39,15 +113,14 @@ gras_msg_t gras_msg_recv_any(void) DEBUG5 ("Consider socket %p (data:%p; Here rdv: %p; Remote rdv: %p; Comm %p) to get a message", sock, sock_data, - (sock_data->server == - SIMIX_process_self())? sock_data-> - rdv_server : sock_data->rdv_client, - (sock_data->server == - SIMIX_process_self())? sock_data-> - rdv_client : sock_data->rdv_server, sock_data->comm_recv); + gras_socket_im_the_server(sock)? + sock_data->rdv_server : sock_data->rdv_client, + gras_socket_im_the_server(sock)? + sock_data->rdv_client : sock_data->rdv_server, + sock_data->comm_recv); - /* The following assert fails in some valid conditions, we need to + /* If the following assert fails in some valid conditions, we need to * change the code downward looking for the socket again. * * For now it relies on the facts (A) that sockets and comms are aligned @@ -79,42 +152,38 @@ gras_msg_t gras_msg_recv_any(void) sock); /* End of paranoia */ - VERB3("Copy comm_recv %p rdv:%p (other rdv:%p)", + VERB3("Consider receiving messages from on comm_recv %p rdv:%p (other rdv:%p)", sock_data->comm_recv, - (sock_data->server == - SIMIX_process_self())? sock_data-> - rdv_server : sock_data->rdv_client, - (sock_data->server == - SIMIX_process_self())? sock_data-> - rdv_client : sock_data->rdv_server); + gras_socket_im_the_server(sock)? + sock_data->rdv_server : sock_data->rdv_client, + gras_socket_im_the_server(sock)? + sock_data->rdv_client : sock_data->rdv_server); xbt_dynar_push(comms, &(sock_data->comm_recv)); } VERB1("Wait on %ld 'sockets'", xbt_dynar_length(comms)); /* Wait for the end of any of these communications */ - got = SIMIX_network_waitany(comms); + got = SIMIX_req_comm_waitany(comms); /* retrieve the message sent in that communication */ xbt_dynar_get_cpy(comms, got, &(comm)); - msg = SIMIX_communication_get_data(comm); - VERB1("Got something. Communication %p's over", comm); - SIMIX_communication_destroy(comm); + msg = SIMIX_req_comm_get_src_data(comm); + sock = xbt_dynar_get_as(trp_proc->sockets, got, gras_socket_t); + sock_data = (gras_trp_sg_sock_data_t) sock->data; + VERB3("Got something. Communication %p's over rdv_server=%p, rdv_client=%p", + comm,sock_data->rdv_server,sock_data->rdv_client); + SIMIX_req_comm_destroy(comm); /* Reinstall a waiting communication on that rdv */ - /* Get the sock again - * For that, we use the fact that */ - sock = xbt_dynar_get_as(trp_proc->sockets, got, gras_socket_t); /* xbt_dynar_foreach(trp_proc->sockets,cursor,sock) { sock_data = (gras_trp_sg_sock_data_t) sock->data; if (sock_data->comm_recv && sock_data->comm_recv == comm) break; } */ - sock_data = (gras_trp_sg_sock_data_t) sock->data; sock_data->comm_recv = - SIMIX_network_irecv(sock_data->rdv_server != NULL ? - //(sock_data->server==SIMIX_process_self())? - sock_data->rdv_server - : sock_data->rdv_client, NULL, 0); + SIMIX_req_comm_irecv(gras_socket_im_the_server(sock) ? + sock_data->rdv_server : sock_data->rdv_client, + NULL, 0, NULL, NULL); return msg; } @@ -128,22 +197,24 @@ void gras_msg_send_ext(gras_socket_t sock, 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_comm_t comm; + 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; + (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; - VERB2("Send msg %s to rdv %p", msgtype->name, target_rdv); + VERB4("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 */ @@ -170,9 +241,9 @@ void gras_msg_send_ext(gras_socket_t sock, payload, msg->payl); } - SIMIX_network_send(target_rdv, whole_payload_size, -1, -1, &msg, - sizeof(void *), &comm, msg); + comm = SIMIX_req_comm_isend(target_rdv, whole_payload_size, -1, &msg, sizeof(void *), NULL, msg, 0); + SIMIX_req_comm_wait(comm, -1); - VERB0("Message sent"); + VERB0("Message sent (and received)"); }