Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
e50fe39b8426ab7253fecdd21a2abe4819fc5686
[simgrid.git] / src / mc / mc_request.c
1 #include "private.h"
2
3 int MC_request_depend(smx_req_t r1, smx_req_t r2)
4 {
5   if (r1->issuer == r2->issuer)
6     return FALSE;
7
8   if(r1->call == REQ_COMM_ISEND && r2->call == REQ_COMM_IRECV)
9     return FALSE;
10
11   if(r1->call == REQ_COMM_IRECV && r2->call == REQ_COMM_ISEND)
12     return FALSE;
13
14   /* FIXME: the following rule assumes that the result of the
15    * isend/irecv call is not stored in a buffer used in the
16    * wait/test call. */
17   if(   (r1->call == REQ_COMM_ISEND || r1->call == REQ_COMM_IRECV)
18      && (r2->call == REQ_COMM_WAIT || r2->call == REQ_COMM_TEST))
19     return FALSE;
20
21   /* FIXME: the following rule assumes that the result of the
22    * isend/irecv call is not stored in a buffer used in the
23    * wait/test call. */
24   if(   (r2->call == REQ_COMM_ISEND || r2->call == REQ_COMM_IRECV)
25      && (r1->call == REQ_COMM_WAIT || r1->call == REQ_COMM_TEST))
26     return FALSE;
27
28   if(r1->call == REQ_COMM_WAIT && r2->call == REQ_COMM_IRECV)
29     return FALSE;
30
31   if(r1->call == REQ_COMM_ISEND && r2->call == REQ_COMM_ISEND
32       && r1->comm_isend.rdv != r2->comm_isend.rdv)
33     return FALSE;
34
35   if(r1->call == REQ_COMM_IRECV && r2->call == REQ_COMM_IRECV
36       && r1->comm_irecv.rdv != r2->comm_irecv.rdv)
37     return FALSE;
38
39   if(r1->call == REQ_COMM_WAIT && r2->call == REQ_COMM_WAIT
40       && r1->comm_wait.comm->comm.src_buff == r2->comm_wait.comm->comm.src_buff
41       && r1->comm_wait.comm->comm.dst_buff == r2->comm_wait.comm->comm.dst_buff)
42     return FALSE;
43
44   if (r1->call == REQ_COMM_WAIT && r2->call == REQ_COMM_WAIT
45       && r1->comm_wait.comm->comm.src_buff != NULL
46       && r1->comm_wait.comm->comm.dst_buff != NULL
47       && r2->comm_wait.comm->comm.src_buff != NULL
48       && r2->comm_wait.comm->comm.dst_buff != NULL
49       && r1->comm_wait.comm->comm.dst_buff != r2->comm_wait.comm->comm.src_buff
50       && r1->comm_wait.comm->comm.dst_buff != r2->comm_wait.comm->comm.dst_buff
51       && r2->comm_wait.comm->comm.dst_buff != r1->comm_wait.comm->comm.src_buff)
52     return FALSE;
53
54   if(r1->call == REQ_COMM_TEST &&
55       (r1->comm_test.comm == NULL
56        || r1->comm_test.comm->comm.src_buff == NULL
57        || r1->comm_test.comm->comm.dst_buff == NULL))
58     return FALSE;
59
60   if(r2->call == REQ_COMM_TEST &&
61       (r2->comm_test.comm == NULL
62        || r2->comm_test.comm->comm.src_buff == NULL
63        || r2->comm_test.comm->comm.dst_buff == NULL))
64     return FALSE;
65
66   if(r1->call == REQ_COMM_TEST && r2->call == REQ_COMM_WAIT
67       && r1->comm_test.comm->comm.src_buff == r2->comm_wait.comm->comm.src_buff
68       && r1->comm_test.comm->comm.dst_buff == r2->comm_wait.comm->comm.dst_buff)
69     return FALSE;
70
71   if(r1->call == REQ_COMM_WAIT && r2->call == REQ_COMM_TEST
72       && r1->comm_wait.comm->comm.src_buff == r2->comm_test.comm->comm.src_buff
73       && r1->comm_wait.comm->comm.dst_buff == r2->comm_test.comm->comm.dst_buff)
74     return FALSE;
75
76   return TRUE;
77 }
78
79 char *MC_request_to_string(smx_req_t req)
80 {
81   char *type = NULL, *args = NULL, *str = NULL; 
82   smx_action_t act = NULL;
83   size_t size = 0;
84   
85   switch(req->call){
86     case REQ_COMM_ISEND:
87       type = bprintf("iSend");
88       args = bprintf("src=%s, buff=%p, size=%zu", req->issuer->name, 
89                      req->comm_isend.src_buff, req->comm_isend.src_buff_size);
90       break;
91     case REQ_COMM_IRECV:
92       size = req->comm_irecv.dst_buff_size ? *req->comm_irecv.dst_buff_size : 0;
93       type = bprintf("iRecv");
94       args = bprintf("dst=%s, buff=%p, size=%zu", req->issuer->name, 
95                      req->comm_irecv.dst_buff, size);
96       break;
97     case REQ_COMM_WAIT:
98       act = req->comm_wait.comm;
99       type = bprintf("Wait");
100       args  = bprintf("%p [%s(%lu) -> %s(%lu)]", act,
101                       act->comm.src_proc ? act->comm.src_proc->name : "",
102                       act->comm.src_proc ? act->comm.src_proc->pid : 0,
103                       act->comm.dst_proc ? act->comm.dst_proc->name : "",
104                       act->comm.dst_proc ? act->comm.dst_proc->pid : 0);
105       break;
106     case REQ_COMM_TEST:
107       act = req->comm_test.comm;
108       type = bprintf("Test");
109       args  = bprintf("%p [%s -> %s]", act, 
110                       act->comm.src_proc ? act->comm.src_proc->name : "",
111                       act->comm.dst_proc ? act->comm.dst_proc->name : "");
112       break;
113
114     case REQ_COMM_WAITANY:
115       type = bprintf("WaitAny");
116       args = bprintf("-");
117       /* FIXME: improve output */
118       break;
119
120     case REQ_COMM_TESTANY:
121        type = bprintf("TestAny");
122        args = bprintf("-");
123        /* FIXME: improve output */
124        break;
125
126     default:
127       THROW_UNIMPLEMENTED;
128   }
129
130   str = bprintf("[(%lu)%s] %s (%s)", req->issuer->pid ,req->issuer->name, type, args);
131   xbt_free(type);
132   xbt_free(args);
133   return str;
134 }
135
136 unsigned int MC_request_testany_fail(smx_req_t req)
137 {
138   unsigned int cursor;
139   smx_action_t action;
140
141   xbt_dynar_foreach(req->comm_testany.comms, cursor, action){
142     if(action->comm.src_proc && action->comm.dst_proc)
143       return FALSE;
144   }
145
146   return TRUE;
147 }