Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'mc++' into mc-merge
authorGabriel Corona <gabriel.corona@loria.fr>
Fri, 28 Feb 2014 08:33:45 +0000 (09:33 +0100)
committerGabriel Corona <gabriel.corona@loria.fr>
Fri, 28 Feb 2014 08:33:45 +0000 (09:33 +0100)
13 files changed:
1  2 
examples/msg/mc/bugged1_liveness.tesh
examples/msg/mc/bugged1_liveness_visited.tesh
src/include/mc/datatypes.h
src/include/mc/mc.h
src/mc/mc_checkpoint.c
src/mc/mc_compare.c
src/mc/mc_dpor.c
src/mc/mc_global.c
src/mc/mc_private.h
src/mc/mc_request.c
src/simgrid/sg_config.c
src/smpi/smpi_base.c
src/xbt/mmalloc/mm_diff.c

@@@ -2,7 -2,7 +2,7 @@@
  
  ! expect signal SIGABRT
  ! timeout 20
 -$ ${bindir:=.}/bugged1_liveness ${bindir:=.}/../msg_platform.xml ${bindir:=.}/deploy_bugged1_liveness.xml --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" --cfg=contexts/factory:ucontext
 +$ ${bindir:=.}/bugged1_liveness ${srcdir:=.}/../msg_platform.xml ${srcdir:=.}/deploy_bugged1_liveness.xml --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" --cfg=contexts/factory:ucontext
  > [  0.000000] (0:@) Configuration change: Set 'model-check' to '1'
  > [  0.000000] (0:@) Check the liveness property promela_bugged1_liveness
  > [  0.000000] (0:@) Get debug information ...
  > [  0.000000] (0:@) |             ACCEPTANCE CYCLE            |
  > [  0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
  > [  0.000000] (0:@) Counter-example that violates formula :
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
- > [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (54)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
- > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
- > [  0.000000] (0:@) [(2)Boivin (client)] iRecv(dst=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (56)
- > [  0.000000] (0:@) [(3)Fafard (client)] iSend(src=(3)Fafard (client), buff=(verbose only), size=(verbose only)) (54)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)]) (62)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iSend(src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (54)
- > [  0.000000] (0:@) [(3)Fafard (client)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)]) (62)
- > [  0.000000] (0:@) [(3)Fafard (client)] iRecv(dst=(3)Fafard (client), buff=(verbose only), size=(verbose only)) (56)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (3)Fafard (client)]) (62)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
- > [  0.000000] (0:@) [(3)Fafard (client)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (3)Fafard (client)]) (62)
- > [  0.000000] (0:@) [(3)Fafard (client)] iSend(src=(3)Fafard (client), buff=(verbose only), size=(verbose only)) (54)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)]) (62)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
- > [  0.000000] (0:@) [(3)Fafard (client)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)]) (62)
- > [  0.000000] (0:@) [(3)Fafard (client)] iSend(src=(3)Fafard (client), buff=(verbose only), size=(verbose only)) (54)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)]) (62)
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+ > [  0.000000] (0:@) [(2)Boivin (client)] iRecv(dst=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(3)Fafard (client)] iSend(src=(3)Fafard (client), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)])
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iSend(src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(3)Fafard (client)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)])
+ > [  0.000000] (0:@) [(3)Fafard (client)] iRecv(dst=(3)Fafard (client), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (3)Fafard (client)])
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(3)Fafard (client)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (3)Fafard (client)])
+ > [  0.000000] (0:@) [(3)Fafard (client)] iSend(src=(3)Fafard (client), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)])
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(3)Fafard (client)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)])
+ > [  0.000000] (0:@) [(3)Fafard (client)] iSend(src=(3)Fafard (client), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)])
  > [  0.000000] (0:@) Expanded pairs = 21
  > [  0.000000] (0:@) Visited pairs = 21
  > [  0.000000] (0:@) Executed transitions = 20
@@@ -2,7 -2,7 +2,7 @@@
  
  ! expect signal SIGABRT
  ! timeout 90
 -$ ${bindir:=.}/bugged1_liveness ${bindir:=.}/../msg_platform.xml ${bindir:=.}/deploy_bugged1_liveness_visited.xml --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" --cfg=contexts/factory:ucontext --cfg=model-check/visited:100
 +$ ${bindir:=.}/bugged1_liveness ${srcdir:=.}/../msg_platform.xml ${srcdir:=.}/deploy_bugged1_liveness_visited.xml --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" --cfg=contexts/factory:ucontext --cfg=model-check/visited:100
  > [  0.000000] (0:@) Configuration change: Set 'model-check' to '1'
  > [  0.000000] (0:@) Configuration change: Set 'model-check/visited' to '100'
  > [  0.000000] (0:@) Check the liveness property promela_bugged1_liveness
  > [  0.000000] (0:@) |             ACCEPTANCE CYCLE            |
  > [  0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
  > [  0.000000] (0:@) Counter-example that violates formula :
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
- > [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (54)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iSend(src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (54)
- > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
- > [  0.000000] (0:@) [(2)Boivin (client)] iRecv(dst=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (56)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)]) (62)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
- > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)]) (62)
- > [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (54)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
- > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
- > [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (54)
- > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
- > [  0.000000] (0:@) [(2)Boivin (client)] iRecv(dst=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (56)
- > [  0.000000] (0:@) [(3)Fafard (client)] iSend(src=(3)Fafard (client), buff=(verbose only), size=(verbose only)) (54)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iSend(src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (54)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)]) (62)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)]) (62)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
- > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)]) (62)
- > [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (54)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
- > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
- > [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (54)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iSend(src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (54)
- > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
- > [  0.000000] (0:@) [(2)Boivin (client)] iRecv(dst=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (56)
- > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)]) (62)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)]) (62)
- > [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (54)
- > [  0.000000] (0:@) [(3)Fafard (client)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)]) (62)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
- > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
- > [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (54)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iSend(src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (54)
- > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
- > [  0.000000] (0:@) [(2)Boivin (client)] iRecv(dst=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (56)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)]) (62)
- > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
- > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)]) (62)
- > [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (54)
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iSend(src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+ > [  0.000000] (0:@) [(2)Boivin (client)] iRecv(dst=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)])
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)])
+ > [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+ > [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+ > [  0.000000] (0:@) [(2)Boivin (client)] iRecv(dst=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(3)Fafard (client)] iSend(src=(3)Fafard (client), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iSend(src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)])
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)])
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)])
+ > [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+ > [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iSend(src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+ > [  0.000000] (0:@) [(2)Boivin (client)] iRecv(dst=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)])
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)])
+ > [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(3)Fafard (client)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)])
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+ > [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iSend(src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+ > [  0.000000] (0:@) [(2)Boivin (client)] iRecv(dst=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)])
+ > [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+ > [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)])
+ > [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only))
  > [  0.000000] (0:@) Expanded pairs = 57
  > [  0.000000] (0:@) Visited pairs = 208
  > [  0.000000] (0:@) Executed transitions = 207
@@@ -1,4 -1,4 +1,4 @@@
 -/* Copyright (c) 2008-2013. The SimGrid Team.
 +/* Copyright (c) 2008-2014. The SimGrid Team.
   * All rights reserved.                                                     */
  
  /* This program is free software; you can redistribute it and/or modify it
@@@ -60,7 -60,7 +60,7 @@@ struct s_dw_type
    int byte_size; /* Size in bytes */
    int element_count; /* Number of elements for array type */
    char *dw_type_id; /* DW_AT_type */
-   xbt_dynar_t members; /* if DW_TAG_structure_type, DW_TAG_union_type*/
+   xbt_dynar_t members; /* if DW_TAG_structure_type, DW_TAG_class_type, DW_TAG_union_type*/
    int is_pointer_type;
    int offset;
    dw_type_t subtype;
diff --combined src/include/mc/mc.h
@@@ -1,4 -1,4 +1,4 @@@
 -/* Copyright (c) 2008-2013. The SimGrid Team.
 +/* Copyright (c) 2008-2014. The SimGrid Team.
   * All rights reserved.                                                     */
  
  /* This program is free software; you can redistribute it and/or modify it
@@@ -31,6 -31,7 +31,7 @@@ extern int _sg_mc_max_depth
  extern int _sg_mc_visited;
  extern char* _sg_mc_dot_output_file;
  extern int _sg_mc_comms_determinism;
+ extern int _sg_mc_send_determinism;
  
  extern xbt_dynar_t mc_heap_comparison_ignore;
  extern xbt_dynar_t stacks_areas;
@@@ -47,6 -48,7 +48,7 @@@ void _mc_cfg_cb_max_depth(const char *n
  void _mc_cfg_cb_visited(const char *name, int pos);
  void _mc_cfg_cb_dot_output(const char *name, int pos);
  void _mc_cfg_cb_comms_determinism(const char *name, int pos);
+ void _mc_cfg_cb_send_determinism(const char *name, int pos);
  
  XBT_PUBLIC(void) MC_do_the_modelcheck_for_real(void);
  
diff --combined src/mc/mc_checkpoint.c
@@@ -1,4 -1,4 +1,4 @@@
 -/* Copyright (c) 2008-2013. The SimGrid Team.
 +/* Copyright (c) 2008-2014. The SimGrid Team.
   * All rights reserved.                                                     */
  
  /* This program is free software; you can redistribute it and/or modify it
@@@ -236,6 -236,14 +236,14 @@@ void MC_find_object_address(memory_map_
  /************************************* Take Snapshot ************************************/
  /****************************************************************************************/
  
+ static bool mc_valid_variable(dw_variable_t var, dw_frame_t frame, const void* ip) {
+   // The variable is not yet valid:
+   if((const void*)((const char*) frame->low_pc + var->start_scope) > ip)
+     return false;
+   else
+     return true;
+ }
  static xbt_dynar_t MC_get_local_variables_values(xbt_dynar_t stack_frames){
  
    unsigned cursor1 = 0;
      dw_variable_t current_variable;
      xbt_dynar_foreach(stack_frame->frame->variables, cursor2, current_variable){
        
+       if(!mc_valid_variable(current_variable, stack_frame->frame, (void*) stack_frame->ip))
+         continue;
        int region_type;
        if((long)stack_frame->ip > (long)mc_libsimgrid_info->start_exec)
          region_type = 1;
diff --combined src/mc/mc_compare.c
@@@ -1,4 -1,4 +1,4 @@@
 -/* Copyright (c) 2012-2013. The SimGrid Team.
 +/* Copyright (c) 2012-2014. The SimGrid Team.
   * All rights reserved.                                                     */
  
  /* This program is free software; you can redistribute it and/or modify it
@@@ -123,7 -123,10 +123,10 @@@ static int compare_areas_with_type(voi
      case DW_TAG_base_type:
      case DW_TAG_enumeration_type:
      case DW_TAG_pointer_type:
+     case DW_TAG_reference_type:
+     case DW_TAG_rvalue_reference_type:
      case DW_TAG_structure_type:
+     case DW_TAG_class_type:
      case DW_TAG_union_type:
        if(subtype->byte_size == 0){ /*declaration of the type, need the complete description */
            subtype = subtype->other_object_same_type;
      }
      break;
    case DW_TAG_pointer_type:
+   case DW_TAG_reference_type:
+   case DW_TAG_rvalue_reference_type:
      if(type->subtype && type->subtype->type == DW_TAG_subroutine_type){
        addr_pointed1 = *((void **)(area1)); 
        addr_pointed2 = *((void **)(area2));
      }
      break;
    case DW_TAG_structure_type:
+   case DW_TAG_class_type:
      xbt_dynar_foreach(type->members, cursor, member){
        XBT_DEBUG("Compare member %s", member->name);
        res = compare_areas_with_type((char *)area1 + member->offset, (char *)area2 + member->offset, info, other_info, member->subtype, region_size, region_type, start_data, pointer_level);
@@@ -220,7 -226,6 +226,6 @@@ static int compare_global_variables(in
  
    if(!compared_pointers){
      compared_pointers = xbt_dynar_new(sizeof(pointers_pair_t), pointers_pair_free_voidp);
-     MC_ignore_global_variable("compared_pointers");
    }else{
      xbt_dynar_reset(compared_pointers);
    }
@@@ -282,7 -287,6 +287,6 @@@ static int compare_local_variables(mc_s
  
    if(!compared_pointers){
      compared_pointers = xbt_dynar_new(sizeof(pointers_pair_t), pointers_pair_free_voidp);
-     MC_ignore_global_variable("compared_pointers");
    }else{
      xbt_dynar_reset(compared_pointers);
    }
@@@ -620,8 -624,7 +624,7 @@@ int SIMIX_pre_mc_compare_snapshots(smx_
  }
  
  int MC_compare_snapshots(void *s1, void *s2){
-   
-   MC_ignore_local_variable("self", "simcall_BODY_mc_snapshot");
    return simcall_mc_compare_snapshots(s1, s2);
  
  }
diff --combined src/mc/mc_dpor.c
@@@ -1,4 -1,4 +1,4 @@@
 -/* Copyright (c) 2008-2013. The SimGrid Team.
 +/* Copyright (c) 2008-2014. The SimGrid Team.
   * All rights reserved.                                                     */
  
  /* This program is free software; you can redistribute it and/or modify it
@@@ -92,7 -92,6 +92,6 @@@ static void deterministic_pattern(xbt_d
      recv_index = 0;
      current_process++;
    }
-   // XBT_DEBUG("Communication-deterministic : %d, Send-deterministic : %d", initial_state_safety->comm_deterministic, initial_state_safety->send_deterministic);
  }
  
  static int complete_comm_pattern(xbt_dynar_t list, mc_comm_pattern_t pattern){
      if(current_pattern->comm == pattern->comm){
        if(!current_pattern->completed){
          current_pattern->src_proc = pattern->comm->comm.src_proc->pid;
+         current_pattern->src_host = simcall_host_get_name(pattern->comm->comm.src_proc->smx_host);
          current_pattern->dst_proc = pattern->comm->comm.dst_proc->pid;
+         current_pattern->dst_host = simcall_host_get_name(pattern->comm->comm.dst_proc->smx_host);
          current_pattern->data_size = pattern->comm->comm.src_buff_size;
          current_pattern->data = xbt_malloc0(current_pattern->data_size);
          current_pattern->matched_comm = pattern->num;
@@@ -123,13 -124,14 +124,14 @@@ void get_comm_pattern(xbt_dynar_t list
    if(call == 1){ // ISEND
      pattern->comm = simcall_comm_isend__get__result(request);
      pattern->type = SIMIX_COMM_SEND;
-     if(pattern->comm->comm.dst_proc != NULL){
-  
+     if(pattern->comm->comm.dst_proc != NULL){ 
        pattern->matched_comm = complete_comm_pattern(list, pattern);
        pattern->dst_proc = pattern->comm->comm.dst_proc->pid;
        pattern->completed = 1;
+       pattern->dst_host = simcall_host_get_name(pattern->comm->comm.dst_proc->smx_host);
      }
      pattern->src_proc = pattern->comm->comm.src_proc->pid;
+     pattern->src_host = simcall_host_get_name(request->issuer->smx_host);
      pattern->data_size = pattern->comm->comm.src_buff_size;
      pattern->data=xbt_malloc0(pattern->data_size);
      memcpy(pattern->data, pattern->comm->comm.src_buff, pattern->data_size);
      if(pattern->comm->comm.src_proc != NULL){
        pattern->matched_comm = complete_comm_pattern(list, pattern);
        pattern->src_proc = pattern->comm->comm.src_proc->pid;
+       pattern->src_host = simcall_host_get_name(pattern->comm->comm.src_proc->smx_host);
        pattern->completed = 1;
        pattern->data_size = pattern->comm->comm.src_buff_size;
        pattern->data=xbt_malloc0(pattern->data_size);
        memcpy(pattern->data, pattern->comm->comm.src_buff, pattern->data_size);
      }
      pattern->dst_proc = pattern->comm->comm.dst_proc->pid;
+     pattern->dst_host = simcall_host_get_name(request->issuer->smx_host);
    }
    if(pattern->comm->comm.rdv != NULL)
      pattern->rdv = strdup(pattern->comm->comm.rdv->name);
@@@ -157,7 -161,10 +161,10 @@@ static void print_communications_patter
    unsigned int cursor = 0;
    mc_comm_pattern_t current_comm;
    xbt_dynar_foreach(comms_pattern, cursor, current_comm){
-     // fprintf(stderr, "%s (%d - comm %p, src : %lu, dst %lu, rdv name %s, data %p, matched with %d)\n", current_comm->type == SIMIX_COMM_SEND ? "iSend" : "iRecv", current_comm->num, current_comm->comm, current_comm->src_proc, current_comm->dst_proc, current_comm->rdv, current_comm->data, current_comm->matched_comm);
+     if(current_comm->type == SIMIX_COMM_SEND)
+       XBT_INFO("[(%lu) %s -> %s] %s ", current_comm->src_proc, current_comm->src_host, current_comm->dst_host, "iSend");
+     else
+       XBT_INFO("[(%lu) %s <- %s] %s ", current_comm->dst_proc, current_comm->dst_host, current_comm->src_host, "iRecv");
    }
  }
  
@@@ -207,6 -214,8 +214,8 @@@ static mc_visited_state_t visited_state
   *  The subrange is the subrange of "equivalence" of the given state.
   */
  static int get_search_interval(xbt_dynar_t all_states, mc_visited_state_t state, int *min, int *max){
+   XBT_VERB("Searching interval for state %i: nd_processes=%zu heap_bytes_used=%zu",
+     state->num, (size_t)state->nb_processes, (size_t)state->heap_bytes_used);
  
    int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
  
@@@ -517,7 -526,7 +526,7 @@@ void MC_dpor(void
        xbt_free(key);
        MC_UNSET_RAW_MEM;
        
-       if(_sg_mc_comms_determinism){
+       if(_sg_mc_comms_determinism || _sg_mc_send_determinism){
          if(req->call == SIMCALL_COMM_ISEND)
            comm_pattern = 1;
          else if(req->call == SIMCALL_COMM_IRECV)
        /* Answer the request */
        SIMIX_simcall_pre(req, value); /* After this call req is no longer usefull */
  
-       if(_sg_mc_comms_determinism){
+       if(_sg_mc_comms_determinism || _sg_mc_send_determinism){
          MC_SET_RAW_MEM;
          if(comm_pattern != 0){
            if(!initial_state_safety->initial_communications_pattern_done)
  
        MC_SET_RAW_MEM;
  
-       if(_sg_mc_comms_determinism){
-         if(!initial_state_safety->initial_communications_pattern_done){
-           //print_communications_pattern(initial_communications_pattern);
-         }else{
+       if(_sg_mc_comms_determinism || _sg_mc_send_determinism){
+         if(initial_state_safety->initial_communications_pattern_done){
            if(interleave_size == 0){ /* if (interleave_size > 0), process interleaved but not enabled => "incorrect" path, determinism not evaluated */
              //print_communications_pattern(communications_pattern);
              deterministic_pattern(initial_communications_pattern, communications_pattern);
+             if(initial_state_safety->comm_deterministic == 0 && _sg_mc_comms_determinism){
+               XBT_INFO("****************************************************");
+               XBT_INFO("***** Non-deterministic communications pattern *****");
+               XBT_INFO("****************************************************");
+               XBT_INFO("Initial communications pattern:");
+               print_communications_pattern(initial_communications_pattern);
+               XBT_INFO("Communications pattern counter-example:");
+               print_communications_pattern(communications_pattern);
+               MC_print_statistics(mc_stats);
+               return;
+             }else if(initial_state_safety->send_deterministic == 0 && _sg_mc_send_determinism){
+               XBT_INFO("****************************************************");
+               XBT_INFO("***** Non-send-deterministic communications pattern *****");
+               XBT_INFO("****************************************************");
+               XBT_INFO("Initial communications pattern:");
+               print_communications_pattern(initial_communications_pattern);
+               XBT_INFO("Communications pattern counter-example:");
+               print_communications_pattern(communications_pattern);
+               MC_print_statistics(mc_stats);
+               return;
+             }
            }
+         }else{
+           initial_state_safety->initial_communications_pattern_done = 1;
          }
-         initial_state_safety->initial_communications_pattern_done = 1;
        }
  
        /* Trash the current state, no longer needed */
diff --combined src/mc/mc_global.c
@@@ -1,4 -1,4 +1,4 @@@
 -/* Copyright (c) 2008-2013. The SimGrid Team.
 +/* Copyright (c) 2008-2014. The SimGrid Team.
   * All rights reserved.                                                     */
  
  /* This program is free software; you can redistribute it and/or modify it
@@@ -35,6 -35,7 +35,7 @@@ int _sg_mc_max_depth=1000
  int _sg_mc_visited=0;
  char *_sg_mc_dot_output_file = NULL;
  int _sg_mc_comms_determinism=0;
+ int _sg_mc_send_determinism=0;
  
  int user_max_depth_reached = 0;
  
@@@ -107,6 -108,13 +108,13 @@@ void _mc_cfg_cb_comms_determinism(cons
    _sg_mc_comms_determinism= xbt_cfg_get_boolean(_sg_cfg_set, name);
  }
  
+ void _mc_cfg_cb_send_determinism(const char *name, int pos) {
+   if (_sg_cfg_init_status && !_sg_do_model_check) {
+     xbt_die("You are specifying a value to enable/disable the detection of send-determinism in the communications schemes after the initialization (through MSG_config?), but model-checking was not activated at config time (through --cfg=model-check:1). This won't work, sorry.");
+   }
+   _sg_mc_send_determinism= xbt_cfg_get_boolean(_sg_cfg_set, name);
+ }
  /* MC global data structures */
  mc_state_t mc_current_state = NULL;
  char mc_replay_mode = FALSE;
@@@ -191,17 -199,16 +199,16 @@@ void dw_variable_free_voidp(void *t)
  
  mc_object_info_t MC_new_object_info(void) {
    mc_object_info_t res = xbt_new0(s_mc_object_info_t, 1);
-   res->local_variables = xbt_dict_new_homogeneous(NULL);
+   res->subprograms = xbt_dynar_new(sizeof(dw_frame_t), NULL);
    res->global_variables = xbt_dynar_new(sizeof(dw_variable_t), dw_variable_free_voidp);
    res->types = xbt_dict_new_homogeneous(NULL);
    res->types_by_name = xbt_dict_new_homogeneous(NULL);
    return res;
  }
  
  void MC_free_object_info(mc_object_info_t* info) {
    xbt_free(&(*info)->file_name);
-   xbt_dict_free(&(*info)->local_variables);
+   xbt_dynar_free(&(*info)->subprograms);
    xbt_dynar_free(&(*info)->global_variables);
    xbt_dict_free(&(*info)->types);
    xbt_dict_free(&(*info)->types_by_name);
@@@ -235,9 -242,8 +242,8 @@@ static void MC_make_functions_index(mc_
  
    // Populate the array:
    dw_frame_t frame = NULL;
-   xbt_dict_cursor_t cursor = NULL;
-   const char* name = NULL;
-   xbt_dict_foreach(info->local_variables, cursor, name, frame) {
+   unsigned cursor = 0;
+   xbt_dynar_foreach(info->subprograms, cursor, frame) {
      if(frame->low_pc==NULL)
        continue;
      s_mc_function_index_item_t entry;
@@@ -307,10 -313,9 +313,9 @@@ static void MC_post_process_variables(m
  }
  
  static void MC_post_process_functions(mc_object_info_t info) {
-   xbt_dict_cursor_t cursor = NULL;
-   char* key = NULL;
+   unsigned cursor = 0;
    dw_frame_t function = NULL;
-   xbt_dict_foreach(info->local_variables, cursor, key, function) {
+   xbt_dynar_foreach(info->subprograms, cursor, function) {
      unsigned cursor2 = 0;
      dw_variable_t variable = NULL;
      xbt_dynar_foreach(function->variables, cursor2, variable) {
@@@ -344,7 -349,7 +349,7 @@@ static dw_location_t MC_dwarf_get_locat
  
    if(location_list != NULL){
      
 -    char *key = bprintf("%d", (int)strtoul(expr, NULL, 16));
 +    char *key = bprintf("%lu", strtoul(expr, NULL, 16));
      loc->type = e_dw_loclist;
      loc->location.loclist =  (xbt_dynar_t)xbt_dict_get_or_null(location_list, key);
      if(loc->location.loclist == NULL)
  
  }
  
 -
  /** \brief Finds a frame (DW_TAG_subprogram) from an DWARF offset in the rangd of this subprogram
   *
   * The offset can be an offset of a child DW_TAG_variable.
@@@ -746,72 -752,50 +751,50 @@@ void MC_ignore_global_variable(const ch
      MC_UNSET_RAW_MEM;
  }
  
+ static void MC_ignore_local_variable_in_object(const char *var_name, const char *frame_name, mc_object_info_t info) {
+   unsigned cursor2;
+   dw_frame_t frame;
+   int start, end;
+   int cursor = 0;
+   dw_variable_t current_var;
+   xbt_dynar_foreach(info->subprograms, cursor2, frame) {
+     if(frame_name && strcmp(frame_name, frame->name))
+       continue;
+     start = 0;
+     end = xbt_dynar_length(frame->variables) - 1;
+     while(start <= end){
+       cursor = (start + end) / 2;
+       current_var = (dw_variable_t)xbt_dynar_get_as(frame->variables, cursor, dw_variable_t);
+       int compare = strcmp(current_var->name, var_name);
+       if(compare == 0){
+         xbt_dynar_remove_at(frame->variables, cursor, NULL);
+         start = 0;
+         end = xbt_dynar_length(frame->variables) - 1;
+       }else if(compare < 0){
+         start = cursor + 1;
+       }else{
+         end = cursor - 1;
+       }
+     }
+   }
+ }
  void MC_ignore_local_variable(const char *var_name, const char *frame_name){
    
    int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
  
+   if(strcmp(frame_name, "*") == 0)
+     frame_name = NULL;
    MC_SET_RAW_MEM;
  
-     unsigned int cursor = 0;
-     dw_variable_t current_var;
-     int start, end;
-     if(strcmp(frame_name, "*") == 0){ /* Remove variable in all frames */
-       xbt_dict_cursor_t dict_cursor;
-       char *current_frame_name;
-       dw_frame_t frame;
-       xbt_dict_foreach(mc_libsimgrid_info->local_variables, dict_cursor, current_frame_name, frame){
-         start = 0;
-         end = xbt_dynar_length(frame->variables) - 1;
-         while(start <= end){
-           cursor = (start + end) / 2;
-           current_var = (dw_variable_t)xbt_dynar_get_as(frame->variables, cursor, dw_variable_t); 
-           if(strcmp(current_var->name, var_name) == 0){
-             xbt_dynar_remove_at(frame->variables, cursor, NULL);
-             start = 0;
-             end = xbt_dynar_length(frame->variables) - 1;
-           }else if(strcmp(current_var->name, var_name) < 0){
-             start = cursor + 1;
-           }else{
-             end = cursor - 1;
-           } 
-         }
-       }
-        xbt_dict_foreach(mc_binary_info->local_variables, dict_cursor, current_frame_name, frame){
-         start = 0;
-         end = xbt_dynar_length(frame->variables) - 1;
-         while(start <= end){
-           cursor = (start + end) / 2;
-           current_var = (dw_variable_t)xbt_dynar_get_as(frame->variables, cursor, dw_variable_t); 
-           if(strcmp(current_var->name, var_name) == 0){
-             xbt_dynar_remove_at(frame->variables, cursor, NULL);
-             start = 0;
-             end = xbt_dynar_length(frame->variables) - 1;
-           }else if(strcmp(current_var->name, var_name) < 0){
-             start = cursor + 1;
-           }else{
-             end = cursor - 1;
-           } 
-         }
-       }
-     }else{
-       xbt_dynar_t variables_list = ((dw_frame_t)xbt_dict_get_or_null(
-                                       mc_libsimgrid_info->local_variables, frame_name))->variables;
-       start = 0;
-       end = xbt_dynar_length(variables_list) - 1;
-       while(start <= end){
-         cursor = (start + end) / 2;
-         current_var = (dw_variable_t)xbt_dynar_get_as(variables_list, cursor, dw_variable_t);
-         if(strcmp(current_var->name, var_name) == 0){
-           xbt_dynar_remove_at(variables_list, cursor, NULL);
-           start = 0;
-           end = xbt_dynar_length(variables_list) - 1;
-         }else if(strcmp(current_var->name, var_name) < 0){
-           start = cursor + 1;
-         }else{
-           end = cursor - 1;
-         } 
-       }
-     } 
+   MC_ignore_local_variable_in_object(var_name, frame_name, mc_libsimgrid_info);
+   if(frame_name!=NULL)
+     MC_ignore_local_variable_in_object(var_name, frame_name, mc_binary_info);
  
    if(!raw_mem_set)
      MC_UNSET_RAW_MEM;
@@@ -961,12 -945,14 +944,14 @@@ void MC_init()
    MC_ignore_local_variable("_throw_ctx", "*");
    MC_ignore_local_variable("ctx", "*");
  
+   MC_ignore_local_variable("self", "simcall_BODY_mc_snapshot");
    MC_ignore_local_variable("next_context", "smx_ctx_sysv_suspend_serial");
    MC_ignore_local_variable("i", "smx_ctx_sysv_suspend_serial");
  
    /* Ignore local variable about time used for tracing */
    MC_ignore_local_variable("start_time", "*"); 
  
+   MC_ignore_global_variable("compared_pointers");
    MC_ignore_global_variable("mc_comp_times");
    MC_ignore_global_variable("mc_snapshot_comparison_time"); 
    MC_ignore_global_variable("mc_time");
@@@ -1246,7 -1232,7 +1231,7 @@@ void MC_replay(xbt_fifo_t stack, int st
        xbt_free(key);
      }
    }
-   if(_sg_mc_comms_determinism)
+   if(_sg_mc_comms_determinism || _sg_mc_send_determinism)
      xbt_dynar_reset(communications_pattern);
    MC_UNSET_RAW_MEM;
    
        }
      }
  
-     if(_sg_mc_comms_determinism){
+     if(_sg_mc_comms_determinism || _sg_mc_send_determinism){
        if(req->call == SIMCALL_COMM_ISEND)
          comm_pattern = 1;
        else if(req->call == SIMCALL_COMM_IRECV)
  
      SIMIX_simcall_pre(req, value);
  
-     if(_sg_mc_comms_determinism){
+     if(_sg_mc_comms_determinism || _sg_mc_send_determinism){
        MC_SET_RAW_MEM;
        if(comm_pattern != 0){
          get_comm_pattern(communications_pattern, req, comm_pattern);
@@@ -1576,9 -1562,11 +1561,11 @@@ void MC_print_statistics(mc_stats_t sta
      fprintf(dot_output, "}\n");
      fclose(dot_output);
    }
-   if(initial_state_safety != NULL && _sg_mc_comms_determinism){
-     XBT_INFO("Communication-deterministic : %s", !initial_state_safety->comm_deterministic ? "No" : "Yes");
-     XBT_INFO("Send-deterministic : %s", !initial_state_safety->send_deterministic ? "No" : "Yes");
+   if(initial_state_safety != NULL){
+     if(_sg_mc_comms_determinism)
+       XBT_INFO("Communication-deterministic : %s", !initial_state_safety->comm_deterministic ? "No" : "Yes");
+     if (_sg_mc_send_determinism)
+       XBT_INFO("Send-deterministic : %s", !initial_state_safety->send_deterministic ? "No" : "Yes");
    }
    MC_UNSET_RAW_MEM;
  }
diff --combined src/mc/mc_private.h
@@@ -1,4 -1,4 +1,4 @@@
 -/* Copyright (c) 2007-2013. The SimGrid Team.
 +/* Copyright (c) 2007-2014. The SimGrid Team.
   * All rights reserved.                                                     */
  
  /* This program is free software; you can redistribute it and/or modify it
@@@ -341,7 -341,7 +341,7 @@@ struct s_mc_object_info 
    char *start_exec, *end_exec; // Executable segment
    char *start_rw, *end_rw; // Read-write segment
    char *start_ro, *end_ro; // read-only segment
-   xbt_dict_t local_variables; // xbt_dict_t<frame_name, dw_frame_t>
+   xbt_dynar_t subprograms; // xbt_dynar_t<dw_frame_t>
    xbt_dynar_t global_variables; // xbt_dynar_t<dw_variable_t>
    xbt_dict_t types; // xbt_dict_t<origin as hexadecimal string, dw_type_t>
    xbt_dict_t types_by_name; // xbt_dict_t<name, dw_type_t> (full defined type only)
@@@ -443,6 -443,8 +443,8 @@@ typedef struct s_dw_variable
    dw_location_t location;
    void* address;
  
+   size_t start_scope;
  }s_dw_variable_t, *dw_variable_t;
  
  struct s_dw_frame{
@@@ -495,6 -497,8 +497,8 @@@ typedef struct s_mc_comm_pattern
    int completed;
    unsigned long src_proc;
    unsigned long dst_proc;
+   const char *src_host;
+   const char *dst_host;
    char *rdv;
    size_t data_size;
    void *data;
diff --combined src/mc/mc_request.c
@@@ -1,4 -1,4 +1,4 @@@
 -/* Copyright (c) 2008-2013. The SimGrid Team.
 +/* Copyright (c) 2008-2014. The SimGrid Team.
   * All rights reserved.                                                     */
  
  /* This program is free software; you can redistribute it and/or modify it
@@@ -279,9 -279,9 +279,9 @@@ char *MC_request_to_string(smx_simcall_
    }
  
    if(args != NULL){
-     str = bprintf("[(%lu)%s (%s)] %s(%s) (%d)", req->issuer->pid , MSG_host_get_name(req->issuer->smx_host), req->issuer->name, type, args, req->call);
+     str = bprintf("[(%lu)%s (%s)] %s(%s)", req->issuer->pid , MSG_host_get_name(req->issuer->smx_host), req->issuer->name, type, args);
    }else{
-     str = bprintf("[(%lu)%s (%s)] %s (%d) ", req->issuer->pid , MSG_host_get_name(req->issuer->smx_host), req->issuer->name, type, req->call);
+     str = bprintf("[(%lu)%s (%s)] %s ", req->issuer->pid , MSG_host_get_name(req->issuer->smx_host), req->issuer->name, type);
    }
  
    xbt_free(args);
diff --combined src/simgrid/sg_config.c
@@@ -1,4 -1,4 +1,4 @@@
 -/* Copyright (c) 2009-2010, 2012-2013. The SimGrid Team.
 +/* Copyright (c) 2009-2010, 2012-2014. The SimGrid Team.
   * All rights reserved.                                                     */
  
  /* This program is free software; you can redistribute it and/or modify it
@@@ -67,7 -67,6 +67,7 @@@ static void sg_config_cmd_line(int *arg
  "Each of these configurations can be used by adding\n"
  "    --cfg=<option name>:<option value>\n"
  "to the command line.\n"
 +"\n"
  "You can also use --help-models to see the details of all models known by this simulator.\n"
  #ifdef HAVE_TRACING
  "\n"
      sg_cfg_exit_early();
  }
  
 +/* callback of the plugin variable */
 +static void _sg_cfg_cb__plugin(const char *name, int pos)
 +{
 +  char *val;
 +
 +  XBT_VERB("PLUGIN");
 +  xbt_assert(_sg_cfg_init_status < 2,
 +              "Cannot load a plugin after the initialization");
 +
 +  val = xbt_cfg_get_string(_sg_cfg_set, name);
 +
 +  if (!strcmp(val, "help")) {
 +    model_help("plugin", surf_plugin_description);
 +    sg_cfg_exit_early();
 +  }
 +
 +  /* New Module missing */
 +  int plugin_id = find_model_description(surf_plugin_description, val);
 +  surf_plugin_description[plugin_id].model_init_preparse();
 +}
 +
  /* callback of the workstation/model variable */
  static void _sg_cfg_cb__workstation_model(const char *name, int pos)
  {
    find_model_description(surf_workstation_model_description, val);
  }
  
 +/* callback of the vm_workstation/model variable */
 +static void _sg_cfg_cb__vm_workstation_model(const char *name, int pos)
 +{
 +  char *val;
 +
 +  xbt_assert(_sg_cfg_init_status < 2,
 +              "Cannot change the model after the initialization");
 +
 +  val = xbt_cfg_get_string(_sg_cfg_set, name);
 +
 +  if (!strcmp(val, "help")) {
 +    model_help("vm_workstation", surf_vm_workstation_model_description);
 +    sg_cfg_exit_early();
 +  }
 +
 +  /* Make sure that the model exists */
 +  find_model_description(surf_vm_workstation_model_description, val);
 +}
 +
  /* callback of the cpu/model variable */
  static void _sg_cfg_cb__cpu_model(const char *name, int pos)
  {
@@@ -448,81 -407,106 +448,81 @@@ static void _sg_cfg_cb__gtnets_jitter_s
  }
  #endif
  
 +/* build description line with possible values */
 +static void describe_model(char *result,
 +                           const s_surf_model_description_t model_description[],
 +                           const char *name,
 +                           const char *description)
 +{
 +  char *p = result +
 +    sprintf(result, "%s. Possible values: %s", description,
 +            model_description[0].name ? model_description[0].name : "n/a");
 +  int i;
 +  for (i = 1; model_description[i].name; i++)
 +    p += sprintf(p, ", %s", model_description[i].name);
 +  sprintf(p,
 +      ".\n       (use 'help' as a value to see the long description of each %s)",
 +          name);
 +}
 +
  /* create the config set, register what should be and parse the command line*/
  void sg_config_init(int *argc, char **argv)
  {
 -  char *description = xbt_malloc(1024);
 -  char *p;
 -  int i;
 +  char description[1024];
  
    /* Create the configuration support */
    if (_sg_cfg_init_status == 0) { /* Only create stuff if not already inited */
 -    sprintf(description,
 -            "The model to use for the CPU. Possible values: ");
 -    p = description;
 -    while (*(++p) != '\0');
 -    for (i = 0; surf_cpu_model_description[i].name; i++)
 -      p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
 -                   surf_cpu_model_description[i].name);
 -    sprintf(p,
 -            ".\n       (use 'help' as a value to see the long description of each model)");
 +
 +    /* Plugins configuration */
 +    describe_model(description, surf_plugin_description,
 +                   "plugin", "The plugins");
 +    xbt_cfg_register(&_sg_cfg_set, "plugin", description,
 +                     xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__plugin, NULL);
 +
 +    describe_model(description, surf_cpu_model_description,
 +                   "model", "The model to use for the CPU");
      xbt_cfg_register(&_sg_cfg_set, "cpu/model", description,
                       xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__cpu_model, NULL);
      xbt_cfg_setdefault_string(_sg_cfg_set, "cpu/model", "Cas01");
  
 -    while (*(++p) != '\0');
 -    for (i = 0; surf_optimization_mode_description[i].name; i++)
 -      p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
 -                   surf_optimization_mode_description[i].name);
 -    sprintf(p,
 -            ".\n       (use 'help' as a value to see the long description of each optimization mode)");
 +    describe_model(description, surf_optimization_mode_description,
 +                   "optimization mode",
 +                   "The optimization modes to use for the CPU");
      xbt_cfg_register(&_sg_cfg_set, "cpu/optim", description,
                       xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__optimization_mode, NULL);
      xbt_cfg_setdefault_string(_sg_cfg_set, "cpu/optim", "Lazy");
  
 -    sprintf(description,
 -            "The model to use for the storage. Possible values: ");
 -    p = description;
 -    while (*(++p) != '\0');
 -    for (i = 0; surf_storage_model_description[i].name; i++)
 -      p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
 -                   surf_storage_model_description[i].name);
 -    sprintf(p,
 -            ".\n       (use 'help' as a value to see the long description of each model)");
 +    describe_model(description, surf_storage_model_description,
 +                   "model", "The model to use for the storage");
      xbt_cfg_register(&_sg_cfg_set, "storage/model", description,
                       xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__storage_mode, NULL);
      xbt_cfg_setdefault_string(_sg_cfg_set, "storage/model", "default");
  
 -    /* ********************************************************************* */
 -    /* TUTORIAL: New model                                                   */
 -    sprintf(description,
 -            "The model to use for the New model. Possible values: ");
 -    p = description;
 -    while (*(++p) != '\0');
 -    for (i = 0; surf_new_model_description[i].name; i++)
 -      p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
 -                   surf_new_model_description[i].name);
 -    sprintf(p,
 -            ".\n       (use 'help' as a value to see the long description of each model)");
 -    xbt_cfg_register(&_sg_cfg_set, "new_model/model", description,
 -                     xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__storage_mode, NULL);
 -    xbt_cfg_setdefault_string(_sg_cfg_set, "new_model/model", "default");
 -    /* ********************************************************************* */
 -
 -    sprintf(description,
 -            "The model to use for the network. Possible values: ");
 -    p = description;
 -    while (*(++p) != '\0');
 -    for (i = 0; surf_network_model_description[i].name; i++)
 -      p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
 -                   surf_network_model_description[i].name);
 -    sprintf(p,
 -            ".\n       (use 'help' as a value to see the long description of each model)");
 +    describe_model(description, surf_network_model_description,
 +                   "model", "The model to use for the network");
      xbt_cfg_register(&_sg_cfg_set, "network/model", description,
                       xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__network_model, NULL);
      xbt_cfg_setdefault_string(_sg_cfg_set, "network/model", "LV08");
  
 -    sprintf(description,
 -            "The optimization modes to use for the network. Possible values: ");
 -    p = description;
 -    while (*(++p) != '\0');
 -    for (i = 0; surf_optimization_mode_description[i].name; i++)
 -      p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
 -                   surf_optimization_mode_description[i].name);
 -    sprintf(p,
 -            ".\n       (use 'help' as a value to see the long description of each optimization mode)");
 +    describe_model(description, surf_optimization_mode_description,
 +                   "optimization mode",
 +                   "The optimization modes to use for the network");
      xbt_cfg_register(&_sg_cfg_set, "network/optim", description,
                       xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__optimization_mode, NULL);
      xbt_cfg_setdefault_string(_sg_cfg_set, "network/optim", "Lazy");
  
 -    sprintf(description,
 -            "The model to use for the workstation. Possible values: ");
 -    p = description;
 -    while (*(++p) != '\0');
 -    for (i = 0; surf_workstation_model_description[i].name; i++)
 -      p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
 -                   surf_workstation_model_description[i].name);
 -    sprintf(p,
 -            ".\n       (use 'help' as a value to see the long description of each model)");
 +    describe_model(description, surf_workstation_model_description,
 +                   "model", "The model to use for the workstation");
      xbt_cfg_register(&_sg_cfg_set, "workstation/model", description,
                       xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__workstation_model, NULL);
      xbt_cfg_setdefault_string(_sg_cfg_set, "workstation/model", "default");
  
 +    describe_model(description, surf_vm_workstation_model_description,
 +                   "model", "The model to use for the vm workstation");
 +    xbt_cfg_register(&_sg_cfg_set, "vm_workstation/model", description,
 +                     xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__vm_workstation_model, NULL);
 +    xbt_cfg_setdefault_string(_sg_cfg_set, "vm_workstation/model", "default");
 +
      xbt_cfg_register(&_sg_cfg_set, "network/TCP_gamma",
                       "Size of the biggest TCP window (cat /proc/sys/net/ipv4/tcp_[rw]mem for recv/send window; Use the last given value, which is the max window size)",
                       xbt_cfgelm_double, 1, 1, _sg_cfg_cb__tcp_gamma, NULL);
                       xbt_cfgelm_string, 0, 1, _mc_cfg_cb_property, NULL);
      xbt_cfg_setdefault_string(_sg_cfg_set, "model-check/property", "");
  
-     /* do determinism model-checking */
-         xbt_cfg_register(&_sg_cfg_set, "model-check/communications_determinism",
+     /* do communications determinism model-checking */
+     xbt_cfg_register(&_sg_cfg_set, "model-check/communications_determinism",
                       "Enable/disable the detection of determinism in the communications schemes",
                       xbt_cfgelm_boolean, 0, 1, _mc_cfg_cb_comms_determinism, NULL);
      xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check/communications_determinism", "no");
  
+     /* do send determinism model-checking */
+     xbt_cfg_register(&_sg_cfg_set, "model-check/send_determinism",
+                      "Enable/disable the detection of send-determinism in the communications schemes",
+                      xbt_cfgelm_boolean, 0, 1, _mc_cfg_cb_send_determinism, NULL);
+     xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check/send_determinism", "no");
      /* Specify the kind of model-checking reduction */
      xbt_cfg_register(&_sg_cfg_set, "model-check/reduction",
                       "Specify the kind of exploration reduction (either none or DPOR)",
      xbt_cfg_setdefault_boolean(_sg_cfg_set, "verbose-exit", "yes");
  
      /* context factory */
 -    sprintf(description,
 -            "Context factory to use in SIMIX. Possible values: thread");
      const char *dflt_ctx_fact = "thread";
 +    {
 +      char *p = description +
 +        sprintf(description,
 +                "Context factory to use in SIMIX. Possible values: %s",
 +                dflt_ctx_fact);
  #ifdef CONTEXT_UCONTEXT
 -    dflt_ctx_fact = "ucontext";
 -    strcat(strcat(description, ", "), dflt_ctx_fact);
 +      dflt_ctx_fact = "ucontext";
 +      p += sprintf(p, ", %s", dflt_ctx_fact);
  #endif
  #ifdef HAVE_RAWCTX
 -    dflt_ctx_fact = "raw";
 -    strcat(strcat(description, ", "), dflt_ctx_fact);
 +      dflt_ctx_fact = "raw";
 +      p += sprintf(p, ", %s", dflt_ctx_fact);
  #endif
 -    strcat(description, ".");
 +      sprintf(p, ".");
 +    }
      xbt_cfg_register(&_sg_cfg_set, "contexts/factory", description,
                       xbt_cfgelm_string, 1, 1, _sg_cfg_cb_context_factory, NULL);
      xbt_cfg_setdefault_string(_sg_cfg_set, "contexts/factory", dflt_ctx_fact);
    } else {
      XBT_WARN("Call to sg_config_init() after initialization ignored");
    }
 -
 -  xbt_free(description);
  }
  
  void sg_config_finalize(void)
  void surf_config_models_setup()
  {
    const char *workstation_model_name;
 +  const char *vm_workstation_model_name;
    int workstation_id = -1;
 +  int vm_workstation_id = -1;
    char *network_model_name = NULL;
    char *cpu_model_name = NULL;
    int storage_id = -1;
  
    workstation_model_name =
        xbt_cfg_get_string(_sg_cfg_set, "workstation/model");
 +  vm_workstation_model_name =
 +      xbt_cfg_get_string(_sg_cfg_set, "vm_workstation/model");
    network_model_name = xbt_cfg_get_string(_sg_cfg_set, "network/model");
    cpu_model_name = xbt_cfg_get_string(_sg_cfg_set, "cpu/model");
    storage_model_name = xbt_cfg_get_string(_sg_cfg_set, "storage/model");
    XBT_DEBUG("Call workstation_model_init");
    surf_workstation_model_description[workstation_id].model_init_preparse();
  
 +  XBT_DEBUG("Call vm_workstation_model_init");
 +  vm_workstation_id = find_model_description(surf_vm_workstation_model_description,
 +                                          vm_workstation_model_name);
 +  surf_vm_workstation_model_description[vm_workstation_id].model_init_preparse();
 +
    XBT_DEBUG("Call storage_model_init");
    storage_id = find_model_description(surf_storage_model_description, storage_model_name);
    surf_storage_model_description[storage_id].model_init_preparse();
  
 -  /* ********************************************************************* */
 -  /* TUTORIAL: New model                                                   */
 -  int new_model_id = -1;
 -  char *new_model_name = NULL;
 -  new_model_name = xbt_cfg_get_string(_sg_cfg_set, "new_model/model");
 -  XBT_DEBUG("Call new model_init");
 -  new_model_id = find_model_description(surf_new_model_description, new_model_name);
 -  surf_new_model_description[new_model_id].model_init_preparse();
 -  /* ********************************************************************* */
 +}
 +
 +int sg_cfg_is_default_value(const char *name)
 +{
 +  return xbt_cfg_is_default_value(_sg_cfg_set, name);
  }
  
  int sg_cfg_get_int(const char* name)
  {
 -  return xbt_cfg_get_int(_sg_cfg_set,name);
 +  return xbt_cfg_get_int(_sg_cfg_set, name);
  }
  
  double sg_cfg_get_double(const char* name)
  {
 -  return xbt_cfg_get_double(_sg_cfg_set,name);
 +  return xbt_cfg_get_double(_sg_cfg_set, name);
  }
  
  char* sg_cfg_get_string(const char* name)
  {
 -  return xbt_cfg_get_string(_sg_cfg_set,name);
 +  return xbt_cfg_get_string(_sg_cfg_set, name);
  }
  
  int sg_cfg_get_boolean(const char* name)
  {
 -  return xbt_cfg_get_boolean(_sg_cfg_set,name);
 +  return xbt_cfg_get_boolean(_sg_cfg_set, name);
  }
  
  void sg_cfg_get_peer(const char *name, char **peer, int *port)
  {
 -  xbt_cfg_get_peer(_sg_cfg_set,name, peer, port);
 +  xbt_cfg_get_peer(_sg_cfg_set, name, peer, port);
  }
  
  xbt_dynar_t sg_cfg_get_dynar(const char* name)
  {
 -  return xbt_cfg_get_dynar(_sg_cfg_set,name);
 +  return xbt_cfg_get_dynar(_sg_cfg_set, name);
  }
diff --combined src/smpi/smpi_base.c
@@@ -1,4 -1,4 +1,4 @@@
 -/* Copyright (c) 2007-2013. The SimGrid Team.
 +/* Copyright (c) 2007-2014. The SimGrid Team.
   * All rights reserved.                                                     */
  
  /* This program is free software; you can redistribute it and/or modify it
@@@ -77,8 -77,7 +77,8 @@@ xbt_dynar_t smpi_ois_values = NULL
  
  static int factor_cmp(const void *pa, const void *pb)
  {
 -  return (((s_smpi_factor_t*)pa)->factor > ((s_smpi_factor_t*)pb)->factor);
 +  return (((s_smpi_factor_t*)pa)->factor > ((s_smpi_factor_t*)pb)->factor) ? 1 :
 +         (((s_smpi_factor_t*)pa)->factor < ((s_smpi_factor_t*)pb)->factor) ? -1 : 0;
  }
  
  
@@@ -94,7 -93,6 +94,7 @@@ static xbt_dynar_t parse_factor(const c
    smpi_factor = xbt_dynar_new(sizeof(s_smpi_factor_t), NULL);
    radical_elements = xbt_str_split(smpi_coef_string, ";");
    xbt_dynar_foreach(radical_elements, iter, value) {
 +    memset(&fact, 0, sizeof(s_smpi_factor_t));
      radical_elements2 = xbt_str_split(value, ":");
      if (xbt_dynar_length(radical_elements2) <2 || xbt_dynar_length(radical_elements2) > 5)
        xbt_die("Malformed radical for smpi factor!");
@@@ -331,9 -329,7 +331,9 @@@ void smpi_mpi_start(MPI_Request request
      request->real_size=request->size;
      smpi_datatype_use(request->old_type);
      smpi_comm_use(request->comm);
 -    request->action = simcall_comm_irecv(mailbox, request->buf, &request->real_size, &match_recv, request);
 +    request->action = simcall_comm_irecv(mailbox, request->buf,
 +                                         &request->real_size, &match_recv,
 +                                         request, -1.0);
  
      //integrate pseudo-timing for buffering of small messages, do not bother to execute the simcall if 0
      double sleeptime = request->detached ? smpi_or(request->size) : 0.0;
        request->refcount++;
        if(request->old_type->has_subtype == 0){
          oldbuf = request->buf;
 -        if (oldbuf && request->size!=0){
 +        if (!_xbt_replay_is_active() && oldbuf && request->size!=0){
            request->buf = xbt_malloc(request->size);
            memcpy(request->buf,oldbuf,request->size);
          }
        simcall_comm_isend(mailbox, request->size, -1.0,
                           request->buf, request->real_size,
                           &match_send,
 -                         &smpi_mpi_request_free_voidp, // how to free the userdata if a detached send fails
 +                         &xbt_free, // how to free the userdata if a detached send fails
                           request,
                           // detach if msg size < eager/rdv switch limit
                           request->detached);
@@@ -764,11 -760,12 +764,11 @@@ void smpi_mpi_wait(MPI_Request * reques
  
    if ((*request)->action != NULL) { // this is not a detached send
      simcall_comm_wait((*request)->action, -1.0);
 -  }
 -
  #ifdef HAVE_MC
-   if(MC_is_active())
+   if(MC_is_active() && (*request)->action)
      (*request)->action->comm.dst_data = NULL; // dangling pointer : dst_data is freed with a wait, need to set it to NULL for system state comparison
  #endif
 +  }
  
    finish_wait(request, status);
    *request = MPI_REQUEST_NULL;
@@@ -1,6 -1,6 +1,6 @@@
  /* mm_diff - Memory snapshooting and comparison                             */
  
 -/* Copyright (c) 2008-2013. The SimGrid Team.
 +/* Copyright (c) 2008-2014. The SimGrid Team.
   * All rights reserved.                                                     */
  
  /* This program is free software; you can redistribute it and/or modify it
@@@ -812,7 -812,10 +812,10 @@@ static int compare_heap_area_with_type(
      case DW_TAG_base_type:
      case DW_TAG_enumeration_type:
      case DW_TAG_pointer_type:
+     case DW_TAG_reference_type:
+     case DW_TAG_rvalue_reference_type:
      case DW_TAG_structure_type:
+     case DW_TAG_class_type:
      case DW_TAG_union_type:
        if(subtype->byte_size == 0){ /*declaration of the type, need the complete description */
            subtype = xbt_dict_get_or_null(other_info->types_by_name, subtype->name);
          return res;
      }
      break;
+   case DW_TAG_reference_type:
+   case DW_TAG_rvalue_reference_type:
    case DW_TAG_pointer_type:
      if(type->dw_type_id && ((dw_type_t)xbt_dict_get_or_null(info->types, type->dw_type_id))->type == DW_TAG_subroutine_type){
        addr_pointed1 = *((void **)(area1)); 
      }
      break;
    case DW_TAG_structure_type:
+   case DW_TAG_class_type:
      if(type->byte_size == 0){ /*declaration of the structure, need the complete description */
        dw_type_t full_type = xbt_dict_get_or_null(info->types_by_name, type->name);
        if(full_type){
@@@ -928,6 -934,7 +934,7 @@@ static char* get_offset_type(char* type
    }
    switch(type->type){
    case DW_TAG_structure_type :
+   case DW_TAG_class_type:
      if(type->byte_size == 0){ /*declaration of the structure, need the complete description */
        if(*switch_type == 0){
          dw_type_t full_type = xbt_dict_get_or_null(info->types_by_name, type->name);
@@@ -1033,7 -1040,7 +1040,7 @@@ int compare_heap_area(void *area1, void
          type = type->subtype;
        }
      }
-     if((type->byte_size == DW_TAG_pointer_type) || ((type->type == DW_TAG_base_type) && type->name!=NULL && (!strcmp(type->name, "char"))))
+     if((type->type == DW_TAG_pointer_type) || ((type->type == DW_TAG_base_type) && type->name!=NULL && (!strcmp(type->name, "char"))))
        type_size = -1;
      else
        type_size = type->byte_size;