Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
147af343d53bc31f31f91a6e6d13e372b88edee8
[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 != r2->call)
9     return FALSE;
10
11   if (r1->call == REQ_COMM_ISEND && r2->call == REQ_COMM_ISEND
12       && r1->comm_isend.rdv != r2->comm_isend.rdv)
13     return FALSE;
14
15   if (r1->call == REQ_COMM_IRECV && r2->call == REQ_COMM_IRECV
16       && r1->comm_irecv.rdv != r2->comm_irecv.rdv)
17     return FALSE;
18
19   if (r1->call == REQ_COMM_WAIT && r2->call == REQ_COMM_WAIT
20       && r1->comm_wait.comm == r2->comm_wait.comm)
21     return FALSE;
22
23   if (r1->call == REQ_COMM_WAIT && r2->call == REQ_COMM_WAIT
24       && r1->comm_wait.comm->comm.src_buff != NULL
25       && r1->comm_wait.comm->comm.dst_buff != NULL
26       && r2->comm_wait.comm->comm.src_buff != NULL
27       && r2->comm_wait.comm->comm.dst_buff != NULL
28       && r1->comm_wait.comm->comm.dst_buff != r2->comm_wait.comm->comm.src_buff
29       && r1->comm_wait.comm->comm.dst_buff != r2->comm_wait.comm->comm.dst_buff
30       && r2->comm_wait.comm->comm.dst_buff != r1->comm_wait.comm->comm.src_buff)
31     return FALSE;
32
33   return TRUE;
34 }
35
36 char *MC_request_to_string(smx_req_t req)
37 {
38   char *type = NULL, *args = NULL, *str = NULL; 
39   smx_action_t act = NULL;
40   size_t size = 0;
41   
42   switch(req->call){
43     case REQ_COMM_ISEND:
44       type = bprintf("iSend");
45       args = bprintf("src=%s, buff=%p, size=%zu", req->issuer->name, 
46                      req->comm_isend.src_buff, req->comm_isend.src_buff_size);
47       break;
48     case REQ_COMM_IRECV:
49       size = req->comm_irecv.dst_buff_size ? *req->comm_irecv.dst_buff_size : 0;
50       type = bprintf("iRecv");
51       args = bprintf("dst=%s, buff=%p, size=%zu", req->issuer->name, 
52                      req->comm_irecv.dst_buff, size);
53       break;
54     case REQ_COMM_WAIT:
55       act = req->comm_wait.comm;
56       type = bprintf("Wait");
57       args  = bprintf("%p [%s -> %s]", act, 
58                       act->comm.src_proc ? act->comm.src_proc->name : "",
59                       act->comm.dst_proc ? act->comm.dst_proc->name : "");
60       break;
61     case REQ_COMM_TEST:
62       act = req->comm_test.comm;
63       type = bprintf("Test");
64       args  = bprintf("%p [%s -> %s]", act, 
65                       act->comm.src_proc ? act->comm.src_proc->name : "",
66                       act->comm.dst_proc ? act->comm.dst_proc->name : "");
67       break;
68     default:
69       THROW_UNIMPLEMENTED;
70   }
71   str = bprintf("[%s] %s (%s)", req->issuer->name, type, args);
72   xbt_free(type);
73   xbt_free(args);
74   return str;
75 }