Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
444950f4e9c69216ffeabdd33e7cf0829c590eb7
[simgrid.git] / src / gras_simix / Msg / gras_simix_sg_msg.c
1 /* $Id$ */
2
3 /* messaging - Function related to messaging code specific to SG            */
4
5 /* Copyright (c) 2003-2005 Martin Quinson. All rights reserved.             */
6
7 /* This program is free software; you can redistribute it and/or modify it
8  * under the terms of the license (GNU LGPL) which comes with this package. */
9
10 #include "xbt/ex.h"
11
12 #include "gras_simix/Virtu/gras_simix_virtu_sg.h"
13
14 #include "gras_simix/Msg/gras_simix_msg_private.h"
15
16 #include "gras_simix/DataDesc/gras_simix_datadesc_interface.h"
17 #include "gras_simix/Transport/gras_simix_transport_interface.h" /* gras_trp_chunk_send/recv */
18 #include "gras_simix/Transport/gras_simix_transport_private.h" /* sock->data */
19
20 XBT_LOG_EXTERNAL_CATEGORY(gras_msg);
21 XBT_LOG_DEFAULT_CATEGORY(gras_msg);
22
23 typedef void* gras_trp_bufdata_;
24
25 void gras_msg_send_ext(gras_socket_t   sock,
26                      e_gras_msg_kind_t kind,
27                        unsigned long int ID,
28                        gras_msgtype_t  msgtype,
29                        void           *payload) {
30 /*
31
32   m_task_t task=NULL;
33   gras_trp_sg_sock_data_t *sock_data = (gras_trp_sg_sock_data_t *)sock->data;
34   gras_msg_t msg;
35   int whole_payload_size=0;*/ /* msg->payload_size is used to memcpy the payload. 
36                                This is used to report the load onto the simulator. It also counts the size of pointed stuff */
37   /*
38         char *name;
39
40   xbt_assert1(!gras_socket_is_meas(sock), 
41               "Asked to send a message on the measurement socket %p", sock);
42
43   msg=xbt_new0(s_gras_msg_t,1);
44   msg->type=msgtype;
45   msg->ID = ID;
46    
47   if (kind == e_gras_msg_kind_rpcerror) {
48     */ /* error on remote host, carfull, payload is an exception */
49     /*msg->payl_size=gras_datadesc_size(gras_datadesc_by_name("ex_t"));
50     msg->payl=xbt_malloc(msg->payl_size);
51     whole_payload_size = gras_datadesc_copy(gras_datadesc_by_name("ex_t"),
52                                             payload,msg->payl);
53   } else if (kind == e_gras_msg_kind_rpcanswer) {
54     msg->payl_size=gras_datadesc_size(msgtype->answer_type);
55     msg->payl=xbt_malloc(msg->payl_size);
56     if (msgtype->answer_type)
57       whole_payload_size = gras_datadesc_copy(msgtype->answer_type,
58                                               payload, msg->payl);
59   } else {
60     msg->payl_size=gras_datadesc_size(msgtype->ctn_type);
61     msg->payl=msg->payl_size?xbt_malloc(msg->payl_size):NULL;
62     if (msgtype->ctn_type)
63       whole_payload_size = gras_datadesc_copy(msgtype->ctn_type,
64                                               payload, msg->payl);
65   }
66
67   msg->kind = kind;
68
69   if (XBT_LOG_ISENABLED(gras_msg,xbt_log_priority_verbose)) {
70      asprintf(&name,"type:'%s';kind:'%s';ID %lu from %s:%d to %s:%d",
71               msg->type->name, e_gras_msg_kind_names[msg->kind], msg->ID,
72               gras_os_myname(),gras_os_myport(),
73               gras_socket_peer_name(sock), gras_socket_peer_port(sock));
74      task=MSG_task_create(name,0,
75                           ((double)whole_payload_size),msg);
76      free(name);
77   } else {
78      task=MSG_task_create(msg->type->name,0,
79                           ((double)whole_payload_size),msg);
80   }
81    
82         sock->bufdata = msg;
83         SIMIX_cond_signal(gras_libdata_by_name_from_remote("trp", sock->data->to_process)->cond);
84   DEBUG1("Prepare to send a message to %s",
85          MSG_host_get_name (sock_data->to_host));
86   if (MSG_task_put_with_timeout(task, sock_data->to_host,sock_data->to_chan,60.0) != MSG_OK) 
87     THROW0(system_error,0,"Problem during the MSG_task_put with timeout 60");
88
89   VERB5("Sent to %s(%d) a message type '%s' kind '%s' ID %lu",
90         MSG_host_get_name(sock_data->to_host),sock_data->to_PID,
91         msg->type->name,
92         e_gras_msg_kind_names[msg->kind],
93         msg->ID);
94 */
95 }
96 /*
97  * receive the next message on the given socket.  
98  */
99 void
100 gras_msg_recv(gras_socket_t    sock,
101               gras_msg_t       msg) {
102 /*
103   m_task_t task=NULL;
104   s_gras_msg_t msg_got;
105   gras_trp_procdata_t pd=(gras_trp_procdata_t)gras_libdata_by_name("gras_trp");
106         gras_msg_procdata_t msg = (gras_msg_procdata_t)gras_libdata_by_name("gras_msg");
107   xbt_assert1(!gras_socket_is_meas(sock), 
108               "Asked to receive a message on the measurement socket %p", sock);
109
110   xbt_assert0(msg,"msg is an out parameter of gras_msg_recv...");
111
112         if (xbt_dynar_length(msg->msg_queue) == 0 ) {
113                 THROW_IMPOSSIBLE;
114         }
115   xbt_dynar_shift(msg->msg_queue,&msg_got);
116
117 //  if (MSG_task_get(&task, pd->chan) != MSG_OK)
118 //    THROW0(system_error,0,"Error in MSG_task_get()");
119
120   msg_got=MSG_task_get_data(task);
121
122
123   msg_got->expe= msg->expe;
124   memcpy(msg,msg_got,sizeof(s_gras_msg_t));
125
126   free(msg_got);
127   if (MSG_task_destroy(task) != MSG_OK)
128     THROW0(system_error,0,"Error in MSG_task_destroy()");
129
130   VERB3("Received a message type '%s' kind '%s' ID %lu",// from %s",
131         msg->type->name,
132         e_gras_msg_kind_names[msg->kind],
133         msg->ID);
134         */
135 }